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

为什么我用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]);
    }
}

修复说明

  1. 修正scanf参数:给start和end加上&,确保scanf能正确将输入值存入变量。
  2. 处理换行符:用strlen获取字符串长度,检查末尾是否为\n,若是则替换为字符串结束符\0,避免切片时包含多余的换行。
  3. 添加边界检查:确保start和end在有效范围内,同时处理起始索引大于结束索引的异常情况,避免无效循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:55:18