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

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

次要问题修复

  1. void main()不符合C标准,标准写法应为int main(),并在末尾返回return 0;
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:50:37