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; }
关键修正说明
- 补充
MAX宏定义,解决编译错误。 - 移除
scanf末尾的空格,避免程序额外等待输入。 - 用
getchar()清理scanf遗留的换行符,避免第一个单词读入空内容。 - 调整循环逻辑:读入字符后立即判断是否为换行,同时限制读取长度,防止数组越界。
- 为每个单词添加
'\0'结束符,保证字符串的合法性。
内容的提问来源于stack exchange,提问作者Larissa
相关产品推荐
相关产品推荐

