指针数组

 

 


//干净版本正确版本
#include <stdio.h> const size_t BUFFER_LEN = 512; int main (void) { char buffer[512]; char *pS[3] = { NULL }; char *pbuffer = buffer; size_t index =0; int i= 0 ; printf("\nEnter 3 messages that total less than %u characters.", BUFFER_LEN-2); for( i= 0 ; i<3; i++) { printf("\nEnter %s message\n",i>0?"another":"a"); pS[i]= &buffer[index]; for(; index<BUFFER_LEN; index++) if((*(pbuffer+index) = getchar())=='\n') { *(pbuffer+index++)='\0'; break; } if((index==BUFFER_LEN)&&((*(pbuffer+index-1)!='\0')||(i<2))) { printf("\nYou ran out of space in the buffer."); return 1; } } printf("\nThe strings you entered are:\n\n"); for( i = 0 ; i<3; i++) printf("%s\n",pS[i]); printf("The buffer has %d characters unused.", BUFFER_LEN-index); return 0; }

 

 

 为啥老是输出空指针,

http://blog.csdn.net/phunxm/article/details/5081159

 

 

 

//这个例子也不对
#include <stdio.h> const size_t BU=512;//指定数组的大小 char buffer[512];//数组 char *pS[3]={NULL};//定义了一个指针数组,包含三个空指针 char *pbuffer =buffer;//数组buffer指向了一个指针pbuffer,pbuffer用了buffer数组中的第一个字节初始化 size_t index =0;//用于遍历 int j; int main (void) { int i; printf("\nEnter 3 messages that total less than %u characters",BU-2); for (i=0;i<3;i++) { printf("\nEnter %s message \n",i>0?"anther":"a"); pS[i]=&buffer[index];//用指针数组某个指针i储存buffer中的地址 for (index=0;index<BU;index++) { if((*(pbuffer+index)=getchar())=='\n') { *(pbuffer+index++)='\0';//index 先自加,再运算index=0读取第一个*(pbuffer+0),第index个 break;//接受下一句话 //*(pbuffer+index+1) } if((index==BU)&&(*(pbuffer+index-1)!='\0')) { printf("\n You ran out of space in the buffer"); return 1; } } } printf("\n The.........are:\n"); for (j=0;j<3;j++) printf("%s\n",*(pS[j])); printf("\n%d,used\n",BU-index); system("pause"); return 0; }

 

 

 

 

//改正!!!!!!!!!!!!!!!!!!!!




#include <stdio.h>
const size_t BUFFER_LEN=512;

int main (void)
{
 
 
    char buffer[512];
    char *pS[3]={NULL};
    char *pbuffer =buffer;
    size_t index =0;
    int i=0;
    
    printf("\nEnter 3 messages that total less than %u characters",BUFFER_LEN-2);
    
    for (i=0;i<3;i++)
    {
        printf("\nEnter %s message \n",i>0?"anther":"a");
        
        pS[i]=&buffer[index];
        
        for (;index<BUFFER_LEN;index++)//之前 自作主张写成(index=0;index<BUFFER_LEN;index++)大错!!!
            if((*(pbuffer+index)=getchar())=='\n')    
        {
            *(pbuffer+index++)='\0';
            break;
        }
        if((index==BUFFER_LEN)&&((*(pbuffer+index-1)!='\0')||(i<2)))//之前忘了加||(i<2) 了
            {
            printf("\n You ran out of space in the buffer");
            return 1;
            }
    }    
        printf("\n The.........are:\n");
        for (i=0;i<3;i++)
            printf("%s\n",pS[i]);//(听信傻逼改的书上例子*(pS[i]),后来写成(pS[i]) 多加了个括号,也不对)
        
        
    printf("\n%d,used\n",BUFFER_LEN-index);
    system("pause");//在这个例子中可有可无
    return 0;     

}

教训,1:用谷歌,坚决不用百度2,抄写有错误时候,先检查清楚有没有抄错,一点不同就可能错,C语言一点也不能含糊,多加个啥都错3看不懂时候要一步一步写好注释,只有这样才容易理解,还有学会使用搜索引擎,可以先整体搜索,然后再细化

 

 

 

 

 

 

 

 

 

 

 

#include <stdio.h>
const size_t BUFFER_LEN=10;

int main (void)
{
 
 
    char buffer[10];
    char *pS[3]={NULL};
    char *pbuffer =buffer;
    size_t index =0;
    int i=0;
    
    printf("\nEnter 3 messages that total less than %u characters",BUFFER_LEN-2);
    
    for (i=0;i<3;i++)
    {
        printf("\nEnter %s message \n",i>0?"anther":"a");
        
        pS[i]=&buffer[index];//把的buffer[0]地址给指针ps[0]
        
        for (;index<BUFFER_LEN;index++)//之前 自作主张写成(index=0;index<BUFFER_LEN;index++)大错!!!
            if((*(pbuffer+index)=getchar())=='\n') 


                /* 
                
                *(pbuffer+0)    index =0          first
                *(pbuffer+1)    index =1        second        
                ...
                *(pbuffer+index)=='\n'                  di  index+1 ge   
                
            假如index==5 ,现在(包括'\n')输入了6个字符,
                
                for(....)
                {
                    if(..)
                    {
                    等价    
                    for范围是第一个if    
                    }
                    
                }
                
                
                */  
        {
            *(pbuffer+index++)='\0'; 
            /*在'\n'后面+上'\0'//当然也可以*(pbuffer+index)='\0'替换'\n'
            
            *(pbuffer+6)='\0'
            
            
            */
            break;
        }
        //index自加   index==6
        
        if((index==BUFFER_LEN)&&((*(pbuffer+index-1)!='\0')||(i<2))) //pbuffer+index  
            {
            printf("\n You ran out of space in the buffer");
            return 1;
            }
            
            
    }    
        printf("\n The.........are:\n");
        for (i=0;i<3;i++)
            printf("%s\n",pS[i]);//%s格式符表示输出的是字符串,后面对应的参数用字符数组或是字符指针。这里正是字符指针
        
        //(听信傻逼改的书上例子*(pS[i]),后来写成(pS[i]) 多加了个括号,也不对)
        
        
    printf("\n%d,shengyu\n",BUFFER_LEN-index);//总的-用掉的空间=剩下的
    system("pause");//在这个例子中可有可无
    return 0;     

}

 

posted @ 2016-06-14 12:37  V5八旗  阅读(149)  评论(0编辑  收藏  举报