最好的我们! 2024-02-28 22:29 采纳率: 50%
浏览 2
已结题

截取前k个字符,为什么错误(语言-c语言)

截取前k个字符,我的代码错在哪?


```c
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
int main()
{
    char (*a)[10000] ;
    gets(a);
    int k;
    scanf("%d", &k);
    int n = k-1;
    while (--k)
    {
        *a++;
    }
    *a = '\0';
    a = a - n;
    puts(a);

    return 0;
}

```

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2024-02-28 22:29
    关注

    最好的我们! 晚上好🌙🌙🌙
    本答案参考通义千问

    你的C语言代码存在一些问题,主要在于gets()函数的使用和字符数组的处理。gets()函数在实际编程中已弃用,因为它存在安全风险。以下是修复这些问题的代码:

    1. 替换gets()函数:使用fgets()函数代替,以防止缓冲区溢出。
    2. 正确初始化字符数组:使用动态内存分配,而不是指针数组。
    3. 处理字符串结束符:在输入字符串后,记得添加\0

    下面是修改后的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
        size_t len;
        char* a = malloc(10000); // 使用malloc动态分配内存
        if (a == NULL) {
            printf("Memory allocation failed.\n");
            return 1;
        }
    
        // fgets()函数代替gets()
        if (fgets(a, 10000, stdin) == NULL) {
            printf("Error reading input.\n");
            free(a);
            return 1;
        }
    
        // 移除换行符
        len = strlen(a) - 1;
        if (a[len] == '\n') {
            a[len] = '\0'; // 如果有换行符,替换为'\0'
        }
    
        int k;
        scanf("%d", &k);
    
        if (k > len) {
            k = len; // 防止截取超出字符串长度
        }
    
        // 截取前k个字符
        for (int i = 0; i < k; ++i) {
            a[i] = a[i + 1]; // 将第i+1个字符移到第i位
        }
        a[k] = '\0';
    
        // 输出截取后的字符串
        puts(a);
    
        // 释放内存
        free(a);
    
        return 0;
    }
    

    这个修改后的版本应该可以正确地截取前k个字符。注意,如果输入的数字大于字符串长度,代码会自动调整截取长度。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月8日
  • 已采纳回答 2月29日
  • 创建了问题 2月28日