字符串比较在C中无法正常工作

时间:2013-12-18 01:39:04

标签: c string scanf strcmp

我无法弄清楚为什么我的字符串比较没有正确比较。这是为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

4 个答案:

答案 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 -