如何用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
相关产品推荐
相关产品推荐

