【问题标题】:fgets() function doesn't workfgets() 函数不起作用
【发布时间】:2014-03-14 02:46:49
【问题描述】:

我想在不使用c库函数的情况下计算字符串的长度并将字符串复制到另一个,但是当我使用fgets()函数从键盘读取字符串时,代码没有显示长度的实际值以及目标字符串。我使用fgets() 函数而不是gets(),因为编译器说gets()function 已“弃用”。但是当我将代码中的sizeof(source) 更改为整数值时,假设50 代码工作正常。谁能告诉我这段代码有什么问题以及为什么编译器说gets() 函数已被弃用。

这是代码:

#include <stdio.h>
#include <stdlib.h>

int len(char *source);
char *coppy(char *dest,char *source);
int main (void){
    char *source,*dest;
    source=(char *)malloc(len(source)+1);
    printf("enter string:");
    fgets(source,sizeof(source),stdin);
    if(source[len(source)-1]=='\n'){
        source[len(source)-1]='\0';
    }

    dest=(char *)malloc(len(source)+1);
    coppy(dest,source);
    printf("dest=%s\n",dest);
    printf("length source=%d\n",len(source));
    printf("length dest=%d\n",len(dest));
    return 0;
}

int len(char *source){
    int i=0;

    while(*source!='\0'){
        source++;
        i++;
    }
    return i;
} 

 char *coppy(char *dest,char *source){
    while(*source!='\0'){
        *dest=*source;
        source++;
        dest++;
    }
    *dest='\0';
    return dest;
}

这是运行该代码时的结果:

enter string:programming
dest=pro
length source=3
length dest=3

【问题讨论】:

  • 更正:fgets() 已经工作了几十年。使用fgets您的代码不起作用。

标签: c string pointers


【解决方案1】:

这是你的第一个错误:

source=(char *)malloc(len(source)+1)

你在初始化之前将source 传递给函数len,这是未定义的行为。从此以后,任何事情都有可能发生。

第二个错误是你使用fgets

fgets(source,sizeof(source),stdin);

fgets 的第二个参数应该是可以写入多少个字符,而不是sizeof(source)。如有必要,请阅读 fgetssizeof 的文档。

【讨论】:

  • 我期望源的长度是分配的内存。我应该怎么做才能修复代码? ——
  • 首先你需要决定分配多少内存。在用户输入之前你不知道这一点,所以它必须是一个常数。然后你可以写source = malloc( MAX_LENGTH + 1 );。或者更好的是你可以写char source[MAX_LENGTH + 1]; 并完全避免动态分配。然后将MAX_LENGTH + 1 作为长度传递给fgets。 (fgets 最多会读取MAX_LENGTH 输入字符,然后它总是会附加空终止符)。
  • 顺便说一句,如果用户在输入 MAX_LENGTH 字符之前按 Enter 键,您使用 fgets 读入的字符串末尾将有一个 \n。你可以检查一下并用它来判断他们是否按下了 Enter,如果你在乎的话。您可能希望在复制到 dest 之前将其删除。
【解决方案2】:

你的错误在于你如何为source分配内存

source=(char *)malloc(len(source)+1);

您期望len(source) 是什么?玩电脑并运行您的len 函数。我很惊讶您的代码可以编译并运行。未初始化的 char* 上的 len 函数应该是未定义的行为。

这就是你的代码失败的原因,你没有分配足够的内存来保存你的输入字符串。

【讨论】:

  • 我希望源的长度是分配的内存。我应该如何修复代码?
  • @harianja:但是您使用源的长度来为源分配内存。你觉得这不是错的吗?分配诸如 256 字节之类的东西,或者任何足以容纳最大字符串的东西;在这种情况下可能没问题。
猜你喜欢
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2014-12-08
相关资源
最近更新 更多