0

我可以帮忙吗?这是我的脚本。

#include <stdio.h>

void main(void) {
    int u;
    char ktp;
    
    printf("Masukkan umur anda : ", &u);
    scanf ("%i ", &u);
    
    printf("Apakah anda memiliki ktp (y atau n): ", &ktp);
    scanf ("%c", &ktp);
    

    
    if (u>=17 && ktp=='y') {
        printf("Selamat, anda layak untuk memilih.");
    } else if(u<17) {
        printf("Mohon maaf, anda belum layak untuk memilih.");
    } else {
        printf("Tolong masukan input yang benar.");
    }

}

1.首先,为什么我不能输入第二个输入?当我输入变量 u 时,该值立即显示,而不输入变量 ktp。2.如何选择是或否并扫描它以与if else语句进行比较。

4

3 回答 3

0

在这两个电话中printf

printf("Masukkan umur anda : ", &u);
printf("Apakah anda memiliki ktp (y atau n): ", &ktp);

参数表达式&u&ktp不使用。

所以像这样重写它们

printf("Masukkan umur anda : " );
printf("Apakah anda memiliki ktp (y atau n): " );

在此 scanf 调用中从格式字符串中删除空格字符

scanf ("%i ", &u);

那就是写

scanf ("%i", &u);

同样如@Weather Vane评论中所写,如果您希望输入的数字被解释为十进制常量,即使它前面有 0,然后使用转换说明符%d而不是%i.

scanf ("%d", &u);

'\n'在调用 scanf 之后,输入缓冲区包含与按下的 Enter 键对应的换行符。

所以下面的 scanf 调用

scanf ("%c", &ktp);

读取变量中的这个换行符ktp。你需要跳过它。为此,请在格式字符串前面加上空格字符,例如

scanf ( " %c", &ktp);
        ^^^^^

来自 C 标准(7.21.6.2 fscanf 函数)

8 输入空白字符(由函数指定)被跳过,除非规范包括[、c 或 n说明符。

5 由空白字符组成的指令通过读取输入直到第一个非空白字符(仍然未读取)或直到无法读取更多字符来执行。该指令永远不会失败。

请注意,根据 C 标准,不带参数的函数 main 应声明为

int main( void )
于 2021-11-01T11:27:25.280 回答
0
#include <stdio.h>

void main(void) {
    int u;
    char ktp;
    
    printf("Masukkan umur anda : ");/*", &u" - this is meaningless*/
    scanf ("%d", &u);\\%*c
    
    printf("Apakah anda memiliki ktp (y atau n): "); /*, &ktp); - this is meaningless*/
    scanf (" %c", &ktp);
    

    
    if (u>=17 && ktp=='y') {
        printf("Selamat, anda layak untuk memilih.");
    } else if(u<17) {
        printf("Mohon maaf, anda belum layak untuk memilih.");
    } else {
        printf("Tolong masukan input yang benar.");
    }

}

@weather-vane write 的问题是 scanf 将您的换行符带入缓冲区而不是作为结束输入。

此外,您尝试打印 &u 而您没有使用 printf %d 打印它。无论如何,它是未定义的变量,所以你不应该这样做。

于 2021-11-01T09:50:04.003 回答
0

1.首先,为什么我不能输入第二个输入?当我输入变量 u 时,该值立即显示,而不输入变量 ktp。

scanf ("%i ", &u);中,格式字符串中的空格告诉scanf消耗空格字符,其中包括换行符。因此,当您输入一个数字并按 Enter 键时,它会将您的输入和一个换行符发送到程序,scanf读取换行符并继续尝试读取。它等待更多输入,因此您的程序不会进入第二个提示。

要解决此问题,请删除空格,将调用更改为scanf("%i", &u);. 然后,当scanf完成读取数字并读取下一个不属于数字的字符时,它将将该下一个字符放回输入流中并返回。然后你的程序将继续到下一个提示和下一个scanf.

将那一秒更改scanfscanf(" %c", &ktp);. 在这里,空格也会告诉scanf消耗空白字符,您希望它这样做以消耗仍在流中的换行符。它消耗完空白字符后,会将下一个字符放入ktp.

2.如何选择是或否并扫描它以与if else语句进行比较。

用于strcmp比较字符串:

if (u >= 17 && strcmp(ktp, "y") == 0)

strcmp返回 0 传递给它的两个字符串相同,如果第一个字符串在排序顺序中较早,则返回负数,如果第二个字符串在后,则返回正数。

于 2021-11-01T10:25:23.880 回答