读取不定长字符串

xiaoxiao2021-02-27  464

C语言中通常使用scanf读取输入,但如果需要给一个char* 读取字符串,则需要使用malloc()预先分配空间,但是因为实现并不知道需要输入的字符串长度,所以可能因为分配的空间不足产生溢出。

读取单个字符使用getchar(),可通过它实现不定长字符串的输入。

1.何时结束循环输入

 当输入时,按下回车键,输入缓冲区中除了字符串,还有一个换行符\n,因此当getchar()读到换行符时,就结束,但是字符串以\0结尾,因此需要额外加入结尾符。

2.存放问题

  当使用scanf作为输入时,存放在char*中,需要使用malloc()分配空间,如果需要读入不定长字符串,则需要一个中间char*作为中转存储。    char* str1 char* str2 给其中一个分配空间,其中需要存储 \0,同时需要一个变量记录输入字符个数。 int i=1; str=(char*)malloc(sizeof(char)*(i+1))将读取的字符存入 str[i-1]=getchar()每次输入一个字符,则变量i加一,同时str2分配空间,存放str1中的内容,释放str1,在申请空间,存放数据,并再次将str2的内容放回。 char* getstr() { char* str1; char* str2; //str2作为中转存储使用 int i=1; str1=(char*)malloc(sizeof(char)*(i+1)); while('\n'!=(str[i-1]=getchar())) { i++; str2=(char*)malloc(strlen(str1)+1)); str1[i-1]='\0'; strcpy(str2,str1); free(str1); str1=(char*)malloc(sizeof(char)*(i+1)); if(NULL==str) //判断是否申请成功,失败需要释放内存 { free(str2); return NULL; } strcpy(str1,str2); free(str2); } str1[i-1]='\0'; //字符串结尾符 return str1; }
转载请注明原文地址: https://www.6miu.com/read-1338.html

最新回复(0)