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

编写回文判断程序遇输入异常:单次输入后自动跳过后续输入

回文程序输入异常问题分析与解决

问题描述

我正在编写一个接收用户输入回文字符串的程序,但遇到输入异常:完成第一个输入项后,程序自动跳过后续输入步骤。现有代码如下:

#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;

}

问题根源

  1. 循环提前终止:循环内的break语句在第一次执行后直接终止循环,后续输入步骤完全没有执行机会。
  2. 输入逻辑错误:scanf("%d %s", ...)要求用户输入整数加字符串,但实际只需要用户输入字符串,序号由循环变量控制,无需额外输入数字。
  3. 字符串存储错误:&word[0]、&word[1]是单个字符的地址,用它们存储完整字符串会导致内容截断,甚至破坏内存;一维数组word[LENGTH]无法存储多个独立字符串,需改用二维数组。
  4. 冗余分支判断:用多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:40:28