鱼C论坛

 找回密码
 立即注册
查看: 52|回复: 3

[已解决]求助!为什么用gets读取的字符串第一位就是0

[复制链接]
发表于 2024-10-14 16:54:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下
第六行gets进来的字符串第一行总是存成/000,但a存的是正常的,请问是为什么啊


#include<stdio.h>

int main(){
    char s[50];
    char a[1];
    gets(s);
    gets(a);
    int i=0;
    while(s[i] != '\0'){
        if(s[i] == a[0]){
            for(int n=i;n<50;n++){
                s[n] = s[n+1];
            }
        }
        i++;
    }
    printf("%s",s);
    return 0;
}
最佳答案
2024-10-14 17:01:42
你的代码中使用`gets`函数存在一些问题。`gets`用来读取字符串,但你给它传入的是单个字符变量,而不是字符数组。因此,内存写入发生越界,导致不可预期的行为。

另外,`gets`本身是不安全的,因为它不检查输入长度,容易造成缓冲区溢出,建议使用更安全的`fgets`。以下是修改后的代码:
#include <stdio.h>

int main(){
    char s[100];  // 定义字符数组用于存储字符串
    char a;

    // 使用fgets读取字符串并去掉换行符
    if (fgets(s, sizeof(s), stdin) != NULL) {
        size_t len = strlen(s);
        if (len > 0 && s[len - 1] == '\n') {
            s[len - 1] = '\0';
        }
    }

    // 使用scanf读取单个字符
    scanf(" %c", &a);

    int i = 0;
    while (s[i] != '\0') {
        if (s[i] == a) {
            // 在这里继续实现你的逻辑
        }
        i++;
    }

    return 0;
}

说明:
1. 定义`char s[100]`来存储读取的字符串,并确保可以容纳足够的字符。
2. `fgets`函数读取输入,并确保不会溢出数组边界。
3. `scanf(" %c", &a);`用于读取单个字符`a`。
4. 循环中使用`s[i]`访问字符串的字符。

这样修改后可以解决问题,并有效防止非法内存访问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-14 17:01:42 | 显示全部楼层    本楼为最佳答案   
你的代码中使用`gets`函数存在一些问题。`gets`用来读取字符串,但你给它传入的是单个字符变量,而不是字符数组。因此,内存写入发生越界,导致不可预期的行为。

另外,`gets`本身是不安全的,因为它不检查输入长度,容易造成缓冲区溢出,建议使用更安全的`fgets`。以下是修改后的代码:
#include <stdio.h>

int main(){
    char s[100];  // 定义字符数组用于存储字符串
    char a;

    // 使用fgets读取字符串并去掉换行符
    if (fgets(s, sizeof(s), stdin) != NULL) {
        size_t len = strlen(s);
        if (len > 0 && s[len - 1] == '\n') {
            s[len - 1] = '\0';
        }
    }

    // 使用scanf读取单个字符
    scanf(" %c", &a);

    int i = 0;
    while (s[i] != '\0') {
        if (s[i] == a) {
            // 在这里继续实现你的逻辑
        }
        i++;
    }

    return 0;
}

说明:
1. 定义`char s[100]`来存储读取的字符串,并确保可以容纳足够的字符。
2. `fgets`函数读取输入,并确保不会溢出数组边界。
3. `scanf(" %c", &a);`用于读取单个字符`a`。
4. 循环中使用`s[i]`访问字符串的字符。

这样修改后可以解决问题,并有效防止非法内存访问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 From FishC Mobile | 显示全部楼层
ai答的最准的一次,检查了好久发现是a内存越界了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
yangdoubao 发表于 2024-10-16 15:21
ai答的最准的一次,检查了好久发现是a内存越界了


很高兴能够帮到你!确实,内存越界是编程中常见的问题,会导致各种奇怪的行为。处理字符串时,一定要确保有足够的存储空间,使用正确的函数来读取数据。如果你还有其他问题,欢迎随时问我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-23 02:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表