编写回文判断程序遇输入异常:单次输入后自动跳过后续输入
回文程序输入异常问题分析与解决
问题描述
我正在编写一个接收用户输入回文字符串的程序,但遇到输入异常:完成第一个输入项后,程序自动跳过后续输入步骤。现有代码如下:
#include<stdio.h> #include<string.h> #define ROWS 6 #define LENGTH 30 int main (void) { int wordcount[ROWS]; // Incraments word count. i.e. Word 1, Word 2, Word 3... char word[LENGTH]; // Stores users string for(int i = 1; i < ROWS; i++) { if(i == 1) { printf("Word %d: ", i); scanf("%d %s", &wordcount[i], &word[0]); // Input ends here. Prints out the rest of the array with "no" values. i++; } if(i == 2) { printf("Word %d: ", i); scanf("%d %s", &wordcount[i], &word[1]); i++; } if(i == 3) { printf("Word %d: ", i); scanf("%d %s", &wordcount[i], &word[2]); i++; } if(i == 4) { printf("Word %d: ", i); scanf("%d %s", &wordcount[i], &word[3]); i++; } if(i == 5) { printf("Word %d: ", i); scanf("%d %s", &wordcount[i], &word[4]); } break; } return 0; }
问题根源
- 循环提前终止:循环内的
break语句在第一次执行后直接终止循环,后续输入步骤完全没有执行机会。 - 输入逻辑错误:
scanf("%d %s", ...)要求用户输入整数加字符串,但实际只需要用户输入字符串,序号由循环变量控制,无需额外输入数字。 - 字符串存储错误:
&word[0]、&word[1]是单个字符的地址,用它们存储完整字符串会导致内容截断,甚至破坏内存;一维数组word[LENGTH]无法存储多个独立字符串,需改用二维数组。 - 冗余分支判断:用多个
if判断循环变量i的取值完全没必要,直接利用循环变量即可简化逻辑。
修正后的输入实现
按照限制(不使用指针、全局变量,仅用scanf()、printf()、fgets()、strlen()),修正后的输入代码如下:
#include<stdio.h> #include<string.h> #define ROWS 6 #define LENGTH 30 // 获取用户输入的函数 void get_user_input(char words[ROWS][LENGTH], int total_rows) { for(int i = 1; i < total_rows; i++) { printf("Word %d: ", i); // 使用scanf读取字符串,限制长度避免缓冲区溢出 scanf("%29s", words[i]); // 若使用fgets,需处理换行符(可选) // fgets(words[i], LENGTH, stdin); // words[i][strcspn(words[i], "\n")] = '\0'; // 移除换行符 } } int main(void) { char words[ROWS][LENGTH]; // 二维数组存储多个输入字符串 get_user_input(words, ROWS); // 后续可添加字符串反转、回文判断的函数调用 return 0; }
修正说明
- 改用二维数组
words[ROWS][LENGTH],每个元素可存储一个完整字符串,满足多输入需求。 - 移除冗余的
if分支和错误的break语句,循环正常遍历1到5(对应5次输入)。 scanf("%29s", words[i])限制读取长度为29,预留一个位置给字符串结束符\0,避免缓冲区溢出。- 将输入逻辑封装为独立函数,符合拆分多个函数的要求。
内容的提问来源于stack exchange,提问作者user20473803
相关产品推荐
相关产品推荐

