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

C语言字符矩阵换行失效及指针整数比较错误求助

问题分析与代码修正

代码中的核心问题

  • MAX未定义:char letras[MAX][MAX];使用了未声明的宏MAX,直接编译会报错。
  • 循环逻辑完全错误:当前do-while循环是先读入字符到palavras[p][c],随后c++,再判断palavras[p][c] != '\n'——此时c指向的是下一个未初始化的内存位置,根本不是刚读入的字符,导致循环无法正常终止,还会访问非法内存。
  • 数组越界风险:未限制c的最大值,当输入单词长度超过CHAR-1时,会超出数组范围,引发未定义行为。
  • 指针与整数比较警告:本质是循环越界访问内存后,编译器将非法内存地址识别为指针类型,和字符(整数类型)'\n'比较导致警告。
  • 缺少字符串结束符:读入的单词没有以'\0'结尾,后续无法作为C字符串正常使用。

修正后的代码

#include <stdio.h>
#include <stdlib.h>
#define CHAR 20
#define MAX 100  // 按需调整矩阵大小

int main(){
    int L, C, P;
    // 移除末尾空格,避免额外等待输入
    scanf("%d %d %d", &L, &C, &P);
    char letras[MAX][MAX];
    char palavras[P][CHAR];

    for(int p=0; p<P; p++){
        int c=0;
        // 处理scanf后遗留的换行符,避免第一个单词读入空行
        if(p == 0){
            getchar();
        }
        // 读取字符直到换行或达到数组上限
        do{
            scanf("%c", &palavras[p][c]);
            // 遇到换行直接终止循环,不存储换行符
            if(palavras[p][c] == '\n'){
                break;
            }
            c++;
            // 预留一个位置给字符串结束符,防止越界
        }while(c < CHAR-1);
        // 添加字符串结束符,确保是合法C字符串
        palavras[p][c] = '\0';
    }

    // 验证输出(可选)
    for(int p=0; p<P; p++){
        printf("单词%d: %s\n", p+1, palavras[p]);
    }

    return 0;
}

关键修正说明

  1. 补充MAX宏定义,解决编译错误。
  2. 移除scanf末尾的空格,避免程序额外等待输入。
  3. 用getchar()清理scanf遗留的换行符,避免第一个单词读入空内容。
  4. 调整循环逻辑:读入字符后立即判断是否为换行,同时限制读取长度,防止数组越界。
  5. 为每个单词添加'\0'结束符,保证字符串的合法性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:23:24