#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.
答案 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的新手,也是编程的新手。那本书非常有用。