C语言键盘输入字符串首元素丢失问题求助
解决输入字符串时Buffer前几个元素丢失的问题
嘿,我看你遇到了输入字符串存入buffer时前几个元素莫名丢失的问题,咱们来拆解下问题根源,再给你几个可行的解决办法~
问题出在哪?
你代码里先用了getchar()来判断是否是终止符(空格),但这个getchar()会直接读取输入的第一个字符,而且你并没有把这个字符存入buffer里。接下来调用fgets()的时候,它会从getchar()读取后的下一个字符开始读,那第一个字符自然就丢了!比如你输入abc def,getchar()先读了'a',然后fgets()从'b'开始读,buffer里就少了第一个字符,这就是前几个元素丢失的核心原因。
修正方案1:用getchar()逐个处理并写入buffer
如果想保留“遇到空格就终止”的逻辑,咱们可以直接用getchar()逐个读取字符,同时把每个字符都写入buffer,直到遇到空格或者buffer存满:
#include<stdio.h> int main(void){ printf("Please type the string:\n"); char buffer[1000]; int c; int index = 0; // 逐个读取字符,直到遇到空格或者buffer存满 while( (c = getchar()) != ' ' && index < sizeof(buffer)-1 ) { buffer[index++] = c; // 如果你需要保留每行的换行符,这里直接存就行;不想存的话可以加判断跳过'\n' } buffer[index] = '\0'; // 必须加字符串结束符,否则打印会出乱码 printf("Your input buffer:\n%s\n", buffer); return 0; }
修正方案2:用fgets逐行读取,同时检查每行是否包含空格
如果你更倾向于按行读取输入,同时保留“遇到空格就终止”的规则,可以用strchr()来查找每行里的空格,这样既满足“每行作为一个字符串”的需求,又能正确终止输入:
#include<stdio.h> #include<string.h> int main(void){ printf("Please type the string (enter space to stop):\n"); char buffer[1000]; char line[200]; // 临时存储每行输入 int buffer_len = 0; while(fgets(line, sizeof(line), stdin) != NULL){ // 检查当前行里是否有空格 char* space_ptr = strchr(line, ' '); if(space_ptr != NULL){ // 把空格之前的内容复制到buffer int content_len = space_ptr - line; if(buffer_len + content_len < sizeof(buffer)-1){ strncpy(buffer + buffer_len, line, content_len); buffer_len += content_len; } break; // 遇到空格就停止输入 } else { // 没有空格,把整行内容追加到buffer int line_len = strlen(line); if(buffer_len + line_len < sizeof(buffer)-1){ strcpy(buffer + buffer_len, line); buffer_len += line_len; } else { printf("Buffer is full!\n"); break; } } } buffer[buffer_len] = '\0'; // 给buffer加上字符串结束标记 printf("Your input buffer:\n%s\n", buffer); return 0; }
额外提醒
不管用哪种方案,都别忘了给buffer加上'\0'字符串结束符,否则打印buffer的时候会出现乱码或者内存越界的问题哦~
内容的提问来源于stack exchange,提问作者user3741679
相关产品推荐
相关产品推荐

