正在进行一些入门级C编程,并且遇到了这个看似非常简单的逻辑运算符的问题。如果输入姓氏Paul,则跳过第一个if语句。同时尝试在使用scanf_s时了解缓冲区大小。
int main(){
char name[25];
printf("what is your last name? ");
printf("(Please capitalize the first letter!)n");
scanf_s(" %s", name, 2);
if ((name[0] >= 'P') && (name[0] <= 'S'))
{
printf("You must go to room 232 for your ticketsn ");
}
else
{
printf("You can get your tickets in the lobbyn");
}
return 0;
}
在scanf_s(" %s", name, 2);
语句中,这里的第三个参数指定要读取给定响应的字符数组(name
(的大小。当您在char name[25];
行中声明25
的实际大小时,我不知道为什么要将2
指定为该大小。
然而,对于2
值,如果您键入多个字符,读取将失败(尝试仅输入"p"作为输入,您将进入if
块(。
来自scanf_s(粗体矿(的文档:
缓冲区大小包括终端null。您可以使用宽度specification字段,以确保读入的令牌适合缓冲区当令牌太大而无法容纳时,不会向缓冲区,除非有宽度规范。
此外,检查scanf_s
(及相关函数(的返回值以确保读取成功是一个好主意!添加一些检查,如下面的代码片段所示,将显示发生了什么,使用各种不同的输入:
//...
int n = scanf_s(" %s", name, 2);
printf("Items read = %d; Name given is: %s ...n", n, name);
//...
这样,当我输入";保罗;作为输入,我看到以下内容:
what is your last name? (Please capitalize the first letter!)
Paul
Items read = 0; Name given is: ...
You can get your tickets in the lobby
注意:关于是否使用scanf_s
代替scanf
的争论(正如Microsoft编译器建议的那样(,请参阅此处:scanf和scanf_s之间的区别。