如何检查C中的字符串是否为空(到目前为止没有任何工作)

时间:2016-09-25 23:08:56

标签: c

我必须制作一个代码,检查学生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);
   }
}

2 个答案:

答案 0 :(得分:3)

您检查空字符串的方式没有错。您的问题是您正在使用scanf, which is notoriously hard to usescanf可能不会按照您的预期处理空格:您希望基于的输入,但scanf会读取令牌流scanf并不关心换行符,因此在您的情况下,在您输入非空格之前它不会读取任何内容,因此不会检索空字符串。

相反,您应该使用fgets(或POSIX getline(如果可用)读取整行,然后使用sscanf解析该行(如有必要)。 (请注意,fgets可以在字符串的末尾留下换行符,因此您必须将其删除。)

也许击败了一匹死马,你对scanf的使用也不安全,因为你没有限制它可以写入charStudent1FirstName的数据量,因此用户可以轻松地溢出目标缓冲区。虽然可以在阅读字符串时跳过一些环节以安全地使用scanf,但使用fgets / getline可以避免这些问题。 (此外,使用fgets / getline会更明显地将charStudent1FirstName作为参数传递,而不是&charStudent1FirstName。)

答案 1 :(得分:3)

以下是我改变的内容:

  1. 使用fgets代替scanf。这意味着如果输入了所有内容,您实际上会看到空白行。
  2. 修剪fgets结果中的换行符。
  3. 使用charStudent1FirstName代替&charStudent1FirstName。您想传递char*,而不是char**。如果您的编译器没有就此发出警告,请考虑使用其他编译器或更改编译设置。
  4. 使用循环,以便在输入一个名称之前提示用户多次输入名称。
  5. 完整的工作代码:

    #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);
    }