以两种方式使用Fgets

时间:2016-11-23 06:18:37

标签: c

我在发布之前查看了一些“FGETS”问题,我收集的是它可能是一个新行字符导致手动输入问题。

    int main ( int argc, char *argv[] ){

    char temp[1000];
    FILE *user_file;

    printf("Starting....\n"); //Used for user visual. 


    if(argc == 2){ //open file
        user_file = fopen(argv[1],"r");
        if( user_file == NULL ){
            printf("No file was found.");
            exit(2);
        }else{
            fgets(temp,strlen(temp),user_file); 
        }
    }else if( argc > 2 ){ // Will exit if arguments are greater than 2.
        printf("Maximum args 2.\n");
        exit(1);
    }else{ 
        printf("File was not provided, please enter the text to convert.\n"); //If the user doesnt provide a file allow manual input.
        fgets(temp,strlen(temp),stdin);
    }

    printf("%s\n",temp);


    return 0;
}//End main

问题:

  1. 为什么fgets没有打开我在cmd行上提供的txt文件,并将其存储到临时数组?

  2. 如果未提供该文件,为什么在“else”语句中跳过Fgets?

  3. 为什么在两个实例中都会跳过打印?
  4. 嘿,顺便说一句,非常感谢你的帮助。 如果你知道一个类似的问题,可以在评论中发布,以便我可以阅读。

3 个答案:

答案 0 :(得分:0)

数组temp[]未初始化,您尝试查找strlen(temp)。你甚至不知道数组中是否存有NUL。尝试做:

#define MAXLINE 1000

并将您的来电更改为fgets()

fgets(temp, MAXLINE, user_file);
...
fgets(temp, MAXLINE, stdin);

答案 1 :(得分:0)

您的代码存在多个问题。

这是第一个问题:

char temp[1000];

您的缓冲区声明不会初始化缓冲区的内容 - 因此每个char值的值将是之前原始内存中的值。在C语言中,大多数字符串都是“空终止”,因此终止NULL0 - 零)很重要,否则可能会遇到缓冲区溢出。

“最佳”方法是在使用之前将数组/缓冲区清零(零初始化),就像这样(在C99中):

char temp[1000] = {0};

...这种方式temp将包含所有0值(NULL),因此写入它的任何内容(假设它不超过999字节)将自动具有空终止符(虽然fgets将附加一个终止0值,但不是C中的每个函数都会这样做。)

第二个问题与第一个问题有关:您正在使用运行时字符串长度函数strlen来获取strlen缓冲区的大小。这是不正确的,因为缓冲区大小在编译时固定为1000. strlen将返回第一个0NULL)char值的索引,这是未定义的行为因为你还没有对缓冲区进行零初始化(所以如果缓冲区的原始原始数据包含零,它可以立即返回0,或者因为从来没有任何零值,它可能会超出1000。

...因此你需要重新使用缓冲区长度,如下所示:

#define TEMP_LENGTH 1000

char temp[ TEMP_LENGTH ];

...

fgets( temp, TEMP_LENGTH, user_file );

最后,当你致电fgets( temp, ..., stdin )时,你犯了同样的错误。

答案 2 :(得分:0)

这里的问题出现在您的代码中,而不是在传递strlen(temp)的第二个参数中传递数值。

fgets(temp,strlen(temp),user_file);

正确的方法是: -

fgets(temp,1000,user_file);