【问题标题】:Why does this strcmp not trigger true?为什么这个 strcmp 不触发 true?
【发布时间】:2021-09-25 23:44:39
【问题描述】:

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

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

【问题讨论】:

标签: c strcmp


【解决方案1】:

改变你的表情:

strcmp(line[0], "mkdir")

进入:

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

匹配返回零(a),当被视为布尔值时,它是 false 而不是 true。换句话说,您的if 正在为mkdir 以外的任何其他 内容开火。


您的代码还有一些其他问题,例如它无法创建长度超过大约 13 个字符的目录('\0' 的缓冲区大小为 20 减 1,"mkdir " 的缓冲区大小为 6),以及 @987654328 的事实如果您只输入mkdir,@ 将是一个任意值。这不会很好结束:-)

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

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) 将根据下表返回一个值:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-15
    • 2021-11-12
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2017-12-06
    相关资源
    最近更新 更多