C语言作业求助:双参数去空格函数代码异常排查
你的C语言代码存在这些问题,逐一修正即可正常运行
1. 二维数组定义错误
你定义的strings[1][101]只有1行,却在循环里尝试存储3个字符串(i从0到2),这会直接导致数组越界,触发未定义行为。应该改成char strings[3][101];,这样能容纳3个长度不超过100的字符串。
2. 主函数输出逻辑错误
- 外层循环
for(i = 0; i <= 0; i++)只执行一次,只能输出第一个字符串,要输出3个处理后的字符串,应该改成for(i = 0; i < 3; i++)。 - 内层循环
j <= 101会遍历到数组之外的内存(数组下标从0到100),还会输出大量空字符,正确的做法是循环到字符串结束符'\0'为止:for(j = 0; strings[i][j] != '\0'; j++)。
3. removeSpaces函数的核心错误
- 变量
j未初始化,直接使用会导致访问随机内存地址,必须初始化为j = 0;。 - 赋值语句逻辑完全错误:你写的
string2[i] = string1[j];搞反了索引用途——i是原字符串的遍历索引,j是目标字符串的存储索引,正确写法应该是string2[j++] = string1[i];。 - 不能将同一个数组同时作为源和目标传入函数(
removeSpaces(strings[i], strings[i]);):修改目标数组时会覆盖原数组的内容,导致后续遍历原字符串时拿到错误字符。可以用临时数组暂存原字符串,再传入函数处理。
4. 额外问题:fgets会读取换行符
fgets会把输入时的换行符'\n'也读进字符串里,如果作业要求只移除空格(不含换行),可以在存储前把换行符替换成结束符,避免后续处理时保留换行。
修正后的完整代码
#include <stdio.h> void removeSpaces(char *string1, char *string2); int main(){ int i, j; char string[101], strings[3][101]; // 修正数组大小,容纳3个字符串 for(i = 0; i < 3; i++){ fgets(string, 101, stdin); // 读取长度设为101,避免截断 // 处理fgets读取到的换行符 for(j = 0; string[j] != '\0'; j++){ if(string[j] == '\n'){ string[j] = '\0'; break; } strings[i][j] = string[j]; } strings[i][j] = '\0'; // 用临时数组暂存原字符串,避免处理时覆盖 char temp[101]; for(j = 0; strings[i][j] != '\0'; j++){ temp[j] = strings[i][j]; } temp[j] = '\0'; removeSpaces(temp, strings[i]); } // 输出所有处理后的字符串 for(i = 0; i < 3; i++){ printf("处理结果%d: %s\n", i+1, strings[i]); } } void removeSpaces(char *string1, char *string2){ int i = 0, j = 0; // 初始化目标字符串索引j for(i = 0; string1[i] != '\0'; i++){ if(string1[i] != ' '){ string2[j++] = string1[i]; // 正确的赋值逻辑 } } string2[j] = '\0'; // 给目标字符串添加结束符 }
内容的提问来源于stack exchange,提问作者Arttu
相关产品推荐
相关产品推荐

