捕获返回/输入按键以退出程序

时间:2012-08-18 01:35:29

标签: newline scanf getchar getc

此程序读入文件,然后要求用户输入要显示的行数。显示行数后,再次提示用户输入更多行或按返回退出。

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

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

#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;
}

2 个答案:

答案 0 :(得分:-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;
}

答案 1 :(得分:-1)

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

如果要将新行捕获为字符,则scanf必须为%c。然后你可以编写一个简单的函数,将整数的字符表示转换为实际的整数。但是%c也只会读取一个字符,因此你真正想要使用的是%s来读取一系列字符(也称为字符串),如果你知道它们将放在字符指针变量或字符数组中您愿意接受的最大位数。字符数组和字符串之间几乎没有区别。具体来说,String是一个以null结尾的字符数组(字符串的最后一个元素是空字符,\ 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;
}