【问题标题】:Detect empty token in C检测 C 中的空令牌
【发布时间】:2015-11-16 20:40:50
【问题描述】:

我使用 strtok 从用户输入将数据分配给变量 cmd。如何检测 cmd 是否为空?类似于检查 cmd 是否为 q,如下所示:

void readcmd() {
    char read_input[50];
    char* cmd;
    char* param;

    scanf("%[^\n]%*c",read_input);
    cmd = strtok(read_input, " ");
    param = strtok(NULL, " ");

    if (strcmp(cmd, "q") == 0) {
        printf("quitting\n");
        exit(0);
    }

    run(cmd, param);
}

【问题讨论】:

  • 你说的empty是什么意思? NULL?
  • 如果你的字符串中没有任何有效的标记,即单词,第一次调用strtok会返回NULL。 (并且您应该检查空标记,而不是将它们传递给其他函数。例如,当 cmdNULL 时,strcmp(cmd, "q") 可能会崩溃。)
  • 当用户被提示输入时,他们只需按回车键。
  • @MOehm 谢谢,所以只需检查 cmd 是否为 NULL 就足够了吗?
  • 是的。如果read_input 为空或仅包含分隔符(在您的情况下为空格),则strtok(read_input, " ") 将返回NULL

标签: c strtok strcmp


【解决方案1】:

如果无法从输入字符串中获取标记,则 strtok() 函数将返回 NULL。

我假设您想知道调用 strtok() 是否有任何意义,换句话说,缓冲区是否包含任何用于标记化的数据?

您可以在字符串的第一个字符中设置一个 nul (\0) 字节:

read_input[0] = '\0';

然后调用scanf()——scanf()返回后你可以检查缓冲区的第一个字节是否仍然是一个空字节:

if (read_input[0] != '\0') {
    /* call strtok() */
} else {
    /* buffer is empty. */
}

\0 在传递给 printf() 或 strtok() 时不会引起任何问题,您仍然可以使用 printf() 输出空字符串,因为 \0 字节只是告诉 strtok( ) 和 printf() 表示它们已到达字符串的末尾。

例如,你可以手动打包一个字符串:

read_input[0] = 'a';
read_input[1] = 'b';
read_input[2] = 'c';
read_input[3] = '\0';
printf("%s", read_input);

【讨论】:

    【解决方案2】:

    if(strcmp(cmd,"")==0){ ... }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多