为什么这个 strcmp 不触发 true?

Why does this strcmp not trigger true?

我正在尝试制作一个 shell 程序并正在处理 mkdir,我正在读取用户输入并使用 sscanf 将其分成几段,然后尝试使用 strcmp 检查第一个单词是否是“mkdir”,如果我在不使用 sscanf 的情况下保持标准输入不变,则 strcmp 会起作用。有人可以告诉我为什么它不能像这样工作,以及如何解决吗? 谢谢,

//#include "parser.c"
#include <stdio.h>
# include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void)
{
    while (1) {
        printf("Enter a command: ");
        char input[20];
        char line[4][20];
        fgets(input, 20, stdin);
        sscanf(input, "%s %s", line[0], line[1]);
        if(strcmp(line[0], "mkdir")) {
            char path[MAX_BUF];
            getcwd(path, MAX_BUF);
            strcat(path, "/");
            strcat(path, line[1]);
            mkdir(path, 0700);
            printf(path);
        }
        
    
        //printf("output %s", input);
    }
}

改变你的表情:

strcmp(line[0], "mkdir")

进入:

strcmp(line[0], "mkdir") == 0

匹配项 returns zero(a) 当被视为布尔值时,它是 false 而不是 true .换句话说,您的 if 目前正在为 其他 而不是 mkdir.

的任何东西开火

您的代码还有一些其他问题,例如它无法创建长度超过 13 个字符的目录(缓冲区大小为 20 减去 '[=15=]' 的 1 减去 "mkdir " 的 6) ,如果您只是单独输入 mkdir,那么 line[1] 将是任意值。那不会有好结果:-)

您可以通过检查以确保扫描了正确数量的东西来绕过最后一个问题,例如:

if (sscanf(input, "%s %s", line[0], line[1]) != 2) {
    output_some_error();
} else {
    your_current_processing_of_line1_and_line2();
}

一般规则是:如果故障会影响您安全进行的能力,您可能应该检查故障并采取行动。


(a) 调用 strcmp(a, b) 将 return 值如下 table:

Situation: a < b a == b a > b
Returns: < 0 0 > 0
Boolean equivalent: true false true