我无法弄清楚为什么我的字符串比较没有正确比较。这是为C.
它正在从这样设置的文件中读取:
1 - ls
2 - cd
3 - history
如果我键入!c,则假设抓取以'c'开头的最后一个使用的字符串并运行该命令。但它永远不会进入if(strcmp(())= 0)行。
我的部分代码在这里:
char currLine[MAXINPUTLINE];
else if (isalpha(input[1])){
int count = 1;
fileRead = fopen(".simpleshell_history", "r");
while(fscanf(fileRead, "%s\n", currLine) != EOF){
printf(input+1);
printf(currLine);
if(strcmp((input+1), currLine) == 0){
printf("%s\n", currLine);
parse(currLine);
}
}
}
这就是while循环中打印的printf,我无法弄清楚如何解决这个问题,我已经坚持了一段时间。这是我输入'!c'
的时候 c
1c
-c
lsc
2c
-c
cdc
3c
-c
historyc
4c
-c
!c!c
答案 0 :(得分:2)
这个循环:
while(fscanf(fileRead, "%s\n", currLine) != EOF) {
会将空格分隔的标记读入currLine
而不是行。因此,第一次迭代将是1
,第二次-
,第三次ls
等,正如您在printfs中看到的那样。名称currLine
表示您想要读取行而不是标记。
然后将读取的令牌与输入行的其余部分进行比较,显然是"c\n"
。由于您永远不会获得带换行符的令牌,因此它永远不会匹配。即使您摆脱了换行符,它也永远不会匹配,因为您的文件不包含令牌c
修改强>
您说您想要将输入行的其余部分与命令的前缀进行比较 这条线。要做到这一点,你想首先弄清楚前缀有多长,然后使用strncmp。您还需要解析文件中的行以将命令与索引分开。所以你可以这样做:
else if (isalpha(input[1])){
int count = 1;
int pfxlen = 1;
while (!isspace(input[pfxlen+1])) pfxlen++;
fileRead = fopen(".simpleshell_history", "r");
while(fscanf(fileRead, "%d - %[^\n]", &index, currLine) == 2) {
if(strncmp((input+1), currLine, pfxlen) == 0) {
printf("%s\n", currLine);
parse(currLine);
}
}
}
答案 1 :(得分:1)
一种可能性是输入可能包含尾随换行符,而curline肯定不会因为scanf规范而导致。
答案 2 :(得分:1)
问题在于你获得input
的方式。 (打印时注意,它有一个换行符)。它有一个尾随\n
而你的currLine
没有。因此,比较失败。
建议OP使用fgets()
进行用户和文件输入。
像
这样的东西char buf[MAXINPUTLINE];
while(fgets(buf, sizeof buf, fileRead) != NULL) {
int LineNo;
if (sscanf(buf, "%d - %s", &LineNo, currLine) != 2) Handle_UnexpectedInput();
...
}
注意:"%s\n"
与"%s "
的效果与"%s\t"
相同:%s
会跳过可选的前导空格,然后扫描非空格。 s
中"%s\n"
之后的空格扫描可选空格。
答案 3 :(得分:1)
如果input
是字符串!c
,并且您希望将其与行2 - cd
匹配,则必须小心。 strcmp
肯定不会起作用,因为如果它所比较的两个字符串是精确匹配,它只会返回成功。
为了测试一个字符串(cd
)是否以另一个字符串(c
)开头,您要使用strncmp()
,这将限制字符数到比较
另外:你需要小心从input
的第二个字符(跳过!
)和currLine
的第五个字符开始比较(跳过{{1}字符)。
这应该可以帮助你:
2 -