指针数组
//干净版本正确版本
#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; }