使用scanf在单个变量中同时从用户获取整数和字符串时出现问题

yacmzcpb  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(101)

我正在做一个简单的程序,它需要一年的用户,并确定是否是闰年或没有。我的问题是,我想这样,如果用户输入一个字符串,它将结束程序,如果字符串是“N”,如果它的任何其他字符串,它将只是打印输入无效。但是到目前为止,任何输入到scanf中的字符串都会破坏程序,并导致它无限循环。

#include <stdio.h>
#include <stdbool.h>
#include "leapyear.h"


int main() {

    int year = 0;

    while (true) {
        printf("Please enter a year to check:");
        scanf("%i", &year);

        if (year <= 0) {
            printf("Sorry that input is invalid..\n");
        }

        else if(year == "N") {
            printf("Quitting....");
            return 0;
        }

        else {
            if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
                 printf("%i IS a leap year \n", year);
            }
            else {
                printf("%i IS NOT a leap year \n", year);
            }
        }
    }
    return 0;
}

我看了这里所有关于scanf的帖子,以及如何在允许字符串输入和存储到同一个变量中的同时使用int,但我无法理解它,任何帮助都将不胜感激。

pxyaymoc

pxyaymoc1#

这条线

else if(year == "N") {

没有意义,因为year属于int类型,因此无法表示字符串"N"
如果要确定用户输入的内容是否表示整数,可以使用fgets将输入内容作为字符串读取,然后使用函数strtol尝试将其转换为整数。以下是一个示例:

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

int main( void )
{
    char line[200];
    long i;
    char *p;

    //read a line of input from the user as a string
    printf( "Please enter an integer or a string: " );
    if ( fgets( line, sizeof line, stdin ) == NULL )
    {
        fprintf( stderr, "Input error!\n" );
        exit( EXIT_FAILURE );
    }

    //remove newline character from input, if it exists
    line[strcspn(line,"\n")] = '\0';

    //attempt to convert string to an integer
    i = strtol( line, &p, 10 );

    //test whether conversion was successful
    if ( p != line )
    {
        printf( "The input was successfully converted to the integer %ld.\n", i );
    }
    else
    {
        printf( "Unable to convert input to an integer, so the input is a simple string.\n" );
    }
}

此程序具有以下行为:
一个二个一个一个
如果输入不是整数,并且您要确定用户是否输入了"N",则可以使用以下条件:

if ( strcmp( line, "N" ) == 0 )
{
    printf( "You entered \"N\".\n" );
}
else
{
    printf( "You did not enter \"N\".\n" );
}
juud5qan

juud5qan2#

C语言是一种静态类型语言,这意味着如果你把int year定义为一个整数,你就不能在其中存储字符串。
也就是说,由于这个原因,您不能同时接受字符串和整数,但您可以将输入作为字符串,然后解析结果,看看它是否恰好是整数。
为此,只需按照建议的here使用strtol

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

int main() {
    char yearString[10];

    while(true) {
        printf("Please enter a year to check: ");
        
        // scan our year to a string
        fgets(yearString, 10, stdin);
        
        // parse it
        int year = (int)strtol(yearString, NULL, 10);
        
        if(year <= 0) {
            // in this case the input might be either
            // invalid or a string so we check for that
            if(yearString[0] == 'N') {
                printf("Quitting....");
                return 0;
            } else {
                printf("Sorry that input is invalid..\n");
            }
        } else {
            if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
                 printf("%i IS a leap year \n", year);
            } else {
                printf("%i IS NOT a leap year \n", year);
            }
        }
    }
    return 0;
}

相关问题