0

该程序读入一个文件,然后要求用户输入要显示的行数。显示行数后,将再次提示用户打印更多行或按回车键退出。

我很难通过捕获换行符和/或回车来退出。如果按下返回按钮,我的程序不会退出,但如果我输入 ascii 值(10 是换行的十进制),我的程序不会退出

我希望程序在按下 enter 时退出。

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

int main (int argc, char *argv[])
{
    FILE *file = fopen(argv[1], "r");
    int newLineCounter, currentChar, numOfLines;

    printf("enter a number of lines of lines to be displayed\n");
    scanf("%d", &numOfLines);

    while ((currentChar = fgetc(file)) != EOF)
    {
        printf("%c", currentChar);    //print character

        if (currentChar == '\n')      //check for newLine character
            newLineCounter++;  

        if (numOfLines == newLineCounter)
        {
            printf("\nenter a number of lines to be displayed or just return to quit\n"); 
            scanf("%d", &numOfLines);

            newLineCounter = 0; 

            //supposed to exit if return is pressed
            if (numOfLines == '\n')  //????why does this only execute when the decimal value of newline is entered
                return 0;
        }
    }

    //printf("%d lines in the text file\n", newLineCounter);

    fclose(file);

    return 0;
}
4

2 回答 2

-1

您可以使用以下命令,而不是使用 scanf:

这样你就可以检测到空行。

要从非空行解析整数,您可以使用:

所以你的程序应该是这样的:

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

int main (int argc, char *argv[])
{
    FILE *file = fopen(argv[1], "r");
    int newLineCounter, currentChar, numOfLines;

    while (true) {
        printf("enter a number of lines of lines to be displayed\n");
        int bytes_read;
        int nbytes = 100;
        char *my_string;

        my_string = (char *) malloc (nbytes + 1);
        bytes_read = getline (&my_string, &nbytes, stdin);
        if (bytes_read == 1) break; // exits if nothing entered on line
        // I believe it reads the newline character at minimum (but check this)
        sscanf(my_string, "%d", &numOfLines);

        // now do stuff with the numOfLines variable
    }


    fclose(file);

    return 0;
}
于 2012-08-18T01:38:46.727 回答
-1

您似乎对 scanf 的格式字符串有错误的理解。%d 明确表示“我正在寻找一个整数”。这就是为什么您只能获得换行符的 ASCII 数字表示。

如果你想捕获一个新行作为一个字符,你的 scanf 需要是 %c。然后,您可以编写一个简单的函数,将整数的字符表示形式转换为实际的整数。但是 %c 也只会读取单个字符,因此您真正想要使用的是 %s 来读取一系列字符(也称为字符串),如果您知道这些字符将被放置在字符指针变量或字符数组中您愿意接受的最大位数。字符数组和字符串之间几乎没有区别。具体来说,String 是一个以空字符结尾的字符数组(字符串的最后一个元素是空字符 \0)。

长答案简短,使用字符指针并将您的 scanf 格式字符串更改为 %s。然后检查第一个字符是否为\n。如果不是,则将字符串转换为整数并使用该值来读取您的行。

以下是您的代码稍作修改以反映此解决方案。

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

int main (int argc, char *argv[])
{
    FILE *file = fopen(argv[1], "r");
    int newLineCounter, currentChar, numOfLines;

    printf("enter a number of lines of lines to be displayed\n");
    scanf("%d", &numOfLines);

    while ((currentChar = fgetc(file)) != EOF)
    {
        printf("%c", currentChar);    //print character

        if (currentChar == '\n')      //check for newLine character
            newLineCounter++;  

        if (numOfLines == newLineCounter)
        {
            char* input;
            printf("\nenter a number of lines to be displayed or just return to quit\n"); 
            scanf("%s", &input);

            if( input[0] == '\n' || input[0] == '\0' ){
                return 0;
            } else {
                numOfLines = atoi( input );
            }
            newLineCounter = 0; 

            //supposed to exit if return is pressed
//            if (numOfLines == '\n')  //????why does this only execute when the decimal value of newline is entered
//                return 0;
//        }
    }

    //printf("%d lines in the text file\n", newLineCounter);

    fclose(file);

    return 0;
}
于 2012-08-18T02:04:14.633 回答