C语言实现句子单词逆序输出时出现未知乱码字符如何解决
乱码原因
- C 语言的字符串要求必须以
\0(空终止符)作为结束标记,你使用printf("%s")输出单词时,程序会从给定的首地址一直向后读取内存,直到碰到\0才会停止输出。你的代码中没有给每个存入output数组的单词末尾添加\0,未初始化的内存中存储的随机值就会被当成字符串的一部分输出,表现为乱码字符。 - 另外你只在碰到空格时切换单词,最后一个单词结尾没有空格,不会触发空格分支的处理,也没有补终止符的操作,所以最后一个单词(逆序后第一个输出的单词)的乱码问题通常最明显。
修复方法
只需要补充两个位置的\0添加逻辑即可:
- 碰到空格切换单词前,给当前已写完的单词末尾加
\0 - 整个输入遍历完成后,给最后一个单词末尾加
\0
修改后的完整代码如下:
#include <stdio.h> #include <string.h> int main(){ int word=0,character=0; char input[50]; char output[50][50] = {0}; // 可选:初始化数组为0,减少异常风险 int InLength; printf("Enter some words:\n"); fgets(input,50,stdin); input[strcspn(input, "\n")] = 0; InLength=strlen(input); for (int i=0;i<InLength;i++){ if (input[i]==' '){ output[word][character] = '\0'; // 给当前单词加终止符 character=0; word++; } else{ output[word][character]=input[i]; character++; } } output[word][character] = '\0'; // 给最后一个单词加终止符 for (word;word>=0;word--){ printf("%s ",output[word]); } printf("\n"); return 0; }
可选优化
你当前的输出逻辑会在整句末尾多输出一个空格,如果要去掉这个多余空格,可以调整输出逻辑:先输出第一个单词,再依次输出空格加后续单词即可。
内容的提问来源于stack exchange,提问作者Bonsai99
相关产品推荐
相关产品推荐

