我必须制作一个代码,检查学生1的名字是否为空,如果是,则要求用户输入名称。但是,当我使用此代码时,它不会显示该消息。当我按下回车键时,光标就会转到下一行,直到我输入内容为止。我已经尝试过使用strcmp,但没有任何效果。
#include <stdio.h>
#include <string.h>
{
char charStudent1FirstName[50] = "";
printf("Please enter Student 1's First name: ");
scanf("%s", &charStudent1FirstName);
if (charStudent1FirstName[0] == '\0')
{
printf("Please input Student 1's first name again: ");
scanf("%s", &charStudent1FirstName);
}
}
答案 0 :(得分:3)
您检查空字符串的方式没有错。您的问题是您正在使用scanf
, which is notoriously hard to use。 scanf
可能不会按照您的预期处理空格:您希望基于行的输入,但scanf
会读取令牌流。 scanf
并不关心换行符,因此在您的情况下,在您输入非空格之前它不会读取任何内容,因此不会检索空字符串。
相反,您应该使用fgets
(或POSIX getline
(如果可用)读取整行,然后使用sscanf
解析该行(如有必要)。 (请注意,fgets
可以在字符串的末尾留下换行符,因此您必须将其删除。)
也许击败了一匹死马,你对scanf
的使用也不安全,因为你没有限制它可以写入charStudent1FirstName
的数据量,因此用户可以轻松地溢出目标缓冲区。虽然可以在阅读字符串时跳过一些环节以安全地使用scanf
,但使用fgets
/ getline
可以避免这些问题。 (此外,使用fgets
/ getline
会更明显地将charStudent1FirstName
作为参数传递,而不是&charStudent1FirstName
。)
答案 1 :(得分:3)
以下是我改变的内容:
fgets
代替scanf
。这意味着如果输入了所有内容,您实际上会看到空白行。fgets
结果中的换行符。charStudent1FirstName
代替&charStudent1FirstName
。您想传递char*
,而不是char**
。如果您的编译器没有就此发出警告,请考虑使用其他编译器或更改编译设置。完整的工作代码:
#include <stdio.h>
#include <string.h>
int main() {
char charStudent1FirstName[50] = "";
while (charStudent1FirstName[0] == 0) {
printf("Please input Student 1's first name: ");
fgets(charStudent1FirstName, 50, stdin);
charStudent1FirstName[strcspn(charStudent1FirstName, "\n")] = 0;
}
printf("First name: %s\n", charStudent1FirstName);
}