C语言字符数组转换异常求助:长字符输出出现乱码
问题分析与修复方案
核心错误:缺少字符串终止符
C语言中,所有用于printf("%s")这类字符串操作的字符数组,必须以\0(空字符)结尾。你的novostr数组只填充了'O'或'X',但没有在最后添加\0,printf会从数组起始位置一直读取内存,直到遇到\0为止。当输入字符串较短时,数组后面的栈内存恰好是0值(随机状态巧合),所以输出正常;但字符串较长时,后面的内存是随机非0值,就会出现乱码。
修复方法:在填充完所有字符后,手动添加终止符:
for(i=0;i<tamanho;i++){ if(tabuleiro[i]==0){ novostr[i]='O'; }else{ novostr[i]='X'; } } // 新增:确保字符串以\0结尾 novostr[tamanho] = '\0';
次要问题修复
void main()不符合C标准,标准写法应为int main(),并在末尾返回return 0;MostraLamberta函数声明返回int但无返回语句,属于未定义行为;若不需要返回值,应改为void类型
修改后的完整代码
#include <stdio.h> #include <string.h> #define BUFFER 1024 // 假设BUFFER为你定义的常量,此处补全示例 void MostraLamberta(int* tabuleiro,int tamanho){ int i; char novostr[BUFFER]; for(i=0;i<tamanho;i++){ if(tabuleiro[i]==0){ novostr[i]='O'; }else{ novostr[i]='X'; } } novostr[tamanho] = '\0'; printf("%s\n", novostr); } int main() { char str[BUFFER]; int i, tamanho, tabuleiro[BUFFER]; scanf("%s", str); tamanho=strlen(str); for(i=0;i<tamanho;i++){ if(str[i]=='0'){ tabuleiro[i]=0; }else{ tabuleiro[i]=1; } } MostraLamberta(tabuleiro, tamanho); return 0; }
内容的提问来源于stack exchange,提问作者Ricardo Costa
相关产品推荐
相关产品推荐

