You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:21:10