【问题标题】:C functions called in main() not returning value在 main() 中调用的 C 函数不返回值
【发布时间】:2021-06-11 21:27:24
【问题描述】:

我正在开发一个具有多个函数的 C 程序,该函数读取文本文件并返回行数、空行数、cmets 等。但是,当我在 main() 中调用多个函数时,只有第一个调用的函数返回它的价值。其他函数返回 - 0。为什么?调用函数的正确方法是什么?

Terminal output

示例代码:

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

int non_blank_lines(FILE *input);
int all_lines(FILE *input);

main (int argc , char **argv)
{
    char file_name[40];
    
    //prompting a user to enter a file name
    printf("Please enter a file name: ");
    scanf("%s", file_name);
    
    //opening and reading the file
    FILE *input = fopen(file_name, "r");
     
    //check if the entered file exists
    if (input == NULL) 
    { 
        printf("File %s does not exist!", file_name); 
        return 0; 
    } 

    //calling the functions and printing the output
    printf("The file %s has %d filled lines.\n", file_name, non_blank_lines(input));
    printf("The file %s has in total %d lines.\n", file_name, all_lines(input));
    
    
    fclose(input);
    return 0;
}

int non_blank_lines(FILE *input)
{
    int count = 0;
    char line[100];

    while(fgets(line, 100, input) != NULL)
    {
        if(strcmp(line, "\0") != 0 && strcmp(line, "\t") != 0 && strcmp(line, "\n") != 0)
            
            count = count + 1;
    }

    return count;
}

int all_lines(FILE *input)
{
    //searching for a new line character to count number of lines in a file
    int line_count = 0;
    char character;

    while((character = getc(input)) !=EOF)
    {
        if (character == '\n')
        line_count = line_count + 1;  
    }
        
    return line_count;
}

【问题讨论】:

  • 你忘记rewind()文件指针了。
  • 第一个函数消耗文件中的所有行...第二个函数没有可读取的内容。
  • 除了char character 应该是int character,因为这是getc() 返回的内容(使调用者能够区分数据0xFF 和EOF -1)。
  • 您应该同时计算单个函数中的总行数和空行数。否则,其中一个函数将消耗所有流,并且没有任何内容留给另一个函数读取。
  • 您是否意识到您不需要读取文件两次来计算空白行和非空白行?

标签: c function file main


【解决方案1】:

fgets() 读取整行,因此 getc() 没有任何内容可供读取。

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 2017-05-08
    • 1970-01-01
    • 2014-03-31
    • 2011-07-06
    相关资源
    最近更新 更多