fgets()函数不起作用

时间:2014-03-14 02:46:49

标签: c string pointers

我想计算字符串的长度并将字符串复制到另一个而不使用c库函数,但是当我使用fgets()函数从键盘读取字符串时,代码也没有显示长度的实际值作为目标字符串。我使用fgets()函数而不是gets(),因为编译器说gets()函数是"已弃用"。但是当我将代码中的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

2 个答案:

答案 0 :(得分:4)

这是你的第一个错误:

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

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

第二个错误是您使用fgets

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

fgets的第二个参数应该是可以写入的字符数,而不是sizeof(source)。阅读fgets的文档,并在必要时阅读sizeof

答案 1 :(得分:0)

您的错误在于如何为source

分配内存

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

您对len(source)的期望是什么?播放计算机并运行len功能。我很惊讶你的代码编译并运行。未初始化的len上的char*函数应该是未定义的行为。

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