C语言指针传递字符数组异常:输入受限及输出错乱问题排查
嘿,这个问题其实是scanf对不同格式符的处理逻辑差异导致的,我来给你拆解清楚:
为什么整数数组正常,字符数组出问题?
你用scanf("%d")读取整数的时候,它会自动跳过所有空白字符(包括空格、回车、制表符),只读取有效的数字。但scanf("%c")不一样——它会读取输入缓冲区里的每一个字符,包括那些你看不见的空格和回车!
当你输入a s f然后按下回车时,输入缓冲区里的内容其实是:a、 (空格)、s、 (空格)、f、\n(回车)。你的循环要读5次,所以前5个字符被依次读进了数组:a、空格、s、空格、f。这就是为什么输出会有空行(对应空格字符),而且你觉得只输入了3个字符,但其实已经读满5个,循环直接结束了,自然不用再输入。
另外提一句,你代码里的main()没写返回类型、display没写返回值,这些虽然不影响运行,但会导致程序结束时返回随机值(就是你看到的return value 32、34),建议改成标准写法。
怎么修复?
给你几种简单可靠的方案:
方案1:在%c前加空格(最推荐)
修改scanf的格式串,在%c前面加一个空格,这个空格会让scanf自动跳过所有前置的空白字符,只读取非空白的有效字符:
#include<stdio.h> int main() { char c[5]; int i; printf("\nEnter the characters (max.5): "); for(i=0; i<=4; i++) scanf(" %c", &c[i]); // 注意%c前的空格 for(i=0; i<=4; i++) display(&c[i]); return 0; } void display(char *k) { printf("\nThe characters you entered are: %c", *k); }
这样你输入a s f g h,程序会自动跳过空格,把5个字母读进数组,输出就全是你输入的字符了。
方案2:用fgets读取整行(适合允许输入空格的场景)
如果你想读取包含空格的整行输入,然后提取前5个字符,可以用fgets:
#include<stdio.h> #include<string.h> int main() { char c[5]; printf("\nEnter the characters (max.5): "); // 读取最多4个字符(因为fgets会自动加结束符'\0') fgets(c, sizeof(c), stdin); // 去掉可能的换行符 if(strlen(c) > 0 && c[strlen(c)-1] == '\n'){ c[strlen(c)-1] = '\0'; } // 输出所有读取到的字符 for(int i=0; i<strlen(c); i++){ display(&c[i]); } return 0; } void display(char *k) { printf("\nThe characters you entered are: %c", *k); }
这个方法适合需要保留空格的场景,比如输入a b c会把这三个字符(包括空格)读进去。
小提醒
记得养成规范写代码的习惯:main函数写成int main()并返回0,函数要明确返回类型(比如display写成void display(...)),这样能避免很多莫名其妙的问题~
内容的提问来源于stack exchange,提问作者daya

