为什么这个 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
我正在尝试制作一个 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 |