为什么我用C语言编写的slice函数无法正常工作?
C语言slice函数问题分析与修复
你的代码存在几个关键问题导致无法正常工作,以下是具体分析和修复方案:
核心错误点
- scanf参数错误:使用
scanf读取整数时,必须传入变量的地址(用&符号取地址)。你的代码中scanf("%d", start);和scanf("%d", end);没有加&,这会导致程序向错误的内存地址写入数据,引发未定义行为(比如崩溃、输出乱码)。 - 未处理fgets读取的换行符:
fgets会将用户输入时按下的回车(\n)一并存入字符串中,切片时可能会意外包含这个换行符,影响输出结果。 - 缺少索引边界检查:没有验证
start和end是否在字符串的有效索引范围内(比如start不能小于0,end不能超过字符串长度-1),如果输入的索引超出范围,会访问非法内存,导致程序异常。
修复后的代码
#include<stdio.h> #include<string.h> void slice(char s[], int start, int end); int main(){ char s[500]; printf("请输入完整的句子或单词:\n"); fgets(s, sizeof(s), stdin); // 移除fgets读取的换行符 size_t len = strlen(s); if (len > 0 && s[len-1] == '\n') { s[len-1] = '\0'; } int start, end; printf("请输入切片起始索引:"); scanf("%d", &start); // 加上&取地址 printf("请输入切片结束索引:"); scanf("%d", &end); // 加上&取地址 // 添加边界检查 len = strlen(s); if (start < 0) start = 0; if (end >= len) end = len - 1; if (start > end) { printf("起始索引不能大于结束索引\n"); return 1; } slice(s, start, end); printf("\n"); // 输出后换行,格式更整洁 return 0; } void slice(char s[], int start, int end){ for(int i = start; i <= end; i++){ printf("%c", s[i]); } }
修复说明
- 修正scanf参数:给
start和end加上&,确保scanf能正确将输入值存入变量。 - 处理换行符:用
strlen获取字符串长度,检查末尾是否为\n,若是则替换为字符串结束符\0,避免切片时包含多余的换行。 - 添加边界检查:确保
start和end在有效范围内,同时处理起始索引大于结束索引的异常情况,避免无效循环。
内容的提问来源于stack exchange,提问作者Ayush Kumar
相关产品推荐
相关产品推荐

