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

C语言字符串数组反转程序的输入异常与输出乱码问题求助

字符串数组反转的两个问题解析

嘿,我来帮你拆解代码里的两个问题,咱们一步步梳理:

一、输入需要额外字符才能继续的原因

你代码里的scanf格式符用了多余的\n,这就是问题根源:

  • 首先看scanf("%d\n", &tot_books);,这里的\n属于空白符匹配,scanf会跳过所有空白(包括换行、空格、制表符),直到遇到非空白字符才会结束这个输入操作。所以你输入数字7并回车后,程序还在等你输入非空白字符,这才导致必须多输入一个字符才能继续。
  • 同样,scanf("%[^\n]\n", titles[i]);里的末尾\n也有同样的问题:当你输入完一个字符串回车后,scanf会一直跳过空白,直到下一个非空白字符出现,这就导致最后一个字符串输入完后,程序还在等待额外输入。

二、输出前出现乱码/??的原因

问题出在反转的循环逻辑:

while (tot_books >= 0) {
    printf("%s\n", titles[tot_books]);
    tot_books--;
}

假设你输入的tot_books是7,数组titles的下标范围是0~6(因为C语言数组下标从0开始),而第一次循环时你访问的是titles[7]——这属于数组越界访问,这块内存是未初始化的随机值,所以打印出来就是乱码或者??。

修正后的代码

把这两个问题都修复后,代码应该是这样的:

#include <stdio.h>
int main(void) {
    int tot_books;
    int i;
    // 去掉格式符里的\n,用getchar处理输入数字后的换行符
    scanf("%d", &tot_books);
    getchar(); // 吃掉数字后面的换行,避免影响后续字符串输入

    char titles[tot_books][101];
    i = 0;
    while (i < tot_books) {
        // 去掉末尾的\n,用%[^\n]读取到换行前的内容,之后用getchar处理换行
        scanf("%[^\n]", titles[i]);
        getchar();
        i++;
    }

    // 从最后一个有效下标(tot_books-1)开始循环,到0结束
    i = tot_books - 1;
    while (i >= 0) {
        printf("%s\n", titles[i]);
        i--;
    }
    return 0;
}

或者你也可以调整原来的循环逻辑,比如先把tot_books减1再循环:

tot_books--; // 先移动到最后一个有效下标
while (tot_books >= 0) {
    printf("%s\n", titles[tot_books]);
    tot_books--;
}

这样修改后,输入完最后一个字符串回车就会直接执行反转输出,也不会再出现乱码啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:32:52