简单if语句和scanf不适合我

时间:2014-12-18 00:08:15

标签: c if-statement

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

int main() {
    char choice[1];
    printf("Do you like oranges? y/n: \n");
    scanf("%s\n", choice);
    if (choice == "y")
        printf("I do too! \n");
    else if (choice == "n")
        printf("Screw you then! \n");
    else
        printf("You did not type it correctly.");
    return 0;
}

当代码运行时它询问我代码中的scanf("");部分时,它不会继续,直到我输入两个内容,这会导致else函数运行。

示例:

Do you like oranges? y/n:

y
y

You did not type it correctly.

2 个答案:

答案 0 :(得分:2)

首先,删除%s格式的scanf后的空格

scanf("%s", choice);

scanf格式的空格具有特殊含义:它将其指向&#34;跳过所有空格&#34;,这使得它继续读取输入流,直到遇到第一个非空白字符为止。这就是迫使它等到你输入两件事情的原因#34;。

其次,C中的字符串比较是通过strcmp函数完成的。您无法通过==运算符比较字符串。使用strcmp或确保只比较一个字符。这个

if (strcmp(choice, "y") == 0)

if (choice[0] == 'y')

第三,长度为1的字符串将不适合长度为1的缓冲区。对于终止\0字符,需要一个额外的缓冲区条目。如果您坚持将字符串y/n响应作为字符串读取,则需要至少2个字符长的缓冲区。这仍然很危险,因为你总是可以输入一个更长的字符串并溢出缓冲区。至少使用%1s说明符来读取字符串。

答案 1 :(得分:1)

首先要做的是......除了你想扫描选择旁边任何其他输入的格式之外,只需删除scanf格式参数中的任何空白字符。话虽这么说,scanf可以接受空格,但这意味着你将提交一些其他参数。

例如:

scanf("%d %c %2f", &SomeDecimal, &SomeChar, &SomeFloat)

虽然不使用&amp;对于scanf中的数组参数,建议使用一个。

不要使用%s,实际上根本不使用scanf来获取字符串,但是嗯...

您正在扫描一个字符串并传递一个长度为1的char,这个char在逻辑上等于char。所以你应该声明

char choice;

并在scanf中使用

scanf("%c", &choice);

如果您坚持char choice[1]声明,请将扫描代码更改为scanf("%c", &choice[0])并检查if(choice[0] == 'y')之类的内容。完全,您应该仔细阅读@AndreyT在回答中刚才所说的内容关于字符串。

最后也是我最重要的事情,获得​​一本初级C语言书。我想你不仅仅是c的新手,也是编程的新手。那本书非常有用。