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

