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

如何用for循环给数组输入值?C程序仅最后一次字符串输入生效原因排查

代码问题分析
  • 输入字符串时地址错误:你定义的str是二维字符数组,每次输入姓名时应该存入第i个元素对应的行地址str[i],但原代码直接写scanf("%s", str),每次都把字符串写入str[0]的位置,前一次输入会被后一次覆盖,自然只有最后一次输入的内容能保留。
  • 变量名遮蔽问题:第二个for循环内部重新定义了局部变量char str[i],这个局部数组会和外部存储姓名的二维数组str重名,直接遮蔽了外部数组,后续操作的都是这个未初始化的局部数组,根本读不到之前输入的姓名。
  • 接口依赖与缓冲区问题:getche()是Windows平台conio.h专属的非标准函数,标准C不提供该接口;同时前面scanf读取数值、字符串后会在输入缓冲区残留换行符,会被后续的字符读取函数直接读到,导致输入逻辑异常。
  • 拼写错误:输出提示里的repeattetins、leter属于拼写错误,会影响可读性。
修复后的完整代码
#include <stdio.h>

int main()
{
    int n,i;
    // 最多存储20个姓名,每个姓名最长19个字符
    char str[20][20]; 
    char ch;
    printf("请输入姓名数量:");
    scanf("%d",&n);
    // 清除scanf读取数值后残留的换行符
    getchar();
 
    for(i=0;i<n;i++) {
        printf("请输入第%d个姓名:",i+1);
        // 将输入的姓名写入对应下标的数组行
        scanf("%s", str[i]);
        getchar();
    }

    for(i=0;i<n;i++) {
        int m=0;
        // 直接指向当前要统计的姓名的起始地址
        char *s = str[i];
        printf("请输入要统计第%d个姓名中出现次数的字符:\n",i+1);
        ch = getchar();
        // 遍历字符串统计目标字符出现次数
        while(*s) {
            if(*s++ == ch)
                m++;
        }
        // 清除本次输入字符后残留的换行符
        getchar();
        printf("出现次数为:%d\n",m);
    }

    return 0;
}
for循环给二维字符数组输入字符串的正确逻辑
  • 二维字符数组存储多个字符串时,第i个字符串的起始地址是数组名[i],输入时直接将该地址传给scanf/fgets等输入函数即可。
  • 不要在局部作用域定义和外层数组同名的变量,避免出现变量遮蔽问题。
  • 每次调用完scanf读取数值/字符串后,要手动处理输入缓冲区残留的换行符,避免后续字符读取逻辑异常。

内容的提问来源于stack exchange,提问作者max_co00

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:54:05