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;
}