C编程:使用getline后strcmp产生意外结果

C编程:使用getline后strcmp产生意外结果,c,getline,strcmp,C,Getline,Strcmp,我正在写一个C程序,它将从stdin中获取命令列表并执行它们。从stdin读入后,我使用strcmp产生了意想不到的结果 这是我的程序test_execvp.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/wait.h> int main(int argc, char const *argv[

我正在写一个C程序,它将从stdin中获取命令列表并执行它们。从stdin读入后,我使用strcmp产生了意想不到的结果

这是我的程序test_execvp.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h> 

int main(int argc, char const *argv[])
{
    char * line_buffer[100];
    size_t line_len;
    int cmd_count = 0;
    char * cmd_buffer[100][100];

   for( line_buffer[cmd_count] = NULL; getline(&line_buffer[cmd_count], &line_len, stdin) > 0; line_buffer[++cmd_count] = NULL)
   {
        line_buffer[cmd_count][strcspn(line_buffer[cmd_count], "\r\n")] = 0;
        int cmd = 0;
        while( (cmd_buffer[cmd_count][cmd] = strsep(&line_buffer[cmd_count], " ")) != NULL )
        {
            cmd++;
        }
    }


    printf("cmd_buffer[0][0]: \"%s\"\n", cmd_buffer[0][0]);
    printf("cmd_buffer[0][1]: \"%s\"\n", cmd_buffer[0][1]);
    printf("cmd_buffer[0][2]: \"%s\"\n", cmd_buffer[0][2]);
    printf("strcmp(cmd_buffer[0][1], \"-i\") == %d\n", strcmp(cmd_buffer[0][1], "-i") );
    printf("strcmp(cmd_buffer[0][1], \"-o\") == %d\n", strcmp(cmd_buffer[0][1], "-o") );

}
可以产生以下输出:

strcmp(cmd_buffer[0][1], "-i") == 181
cmd_buffer[0][1]: "–i"
如果该行:

printf("strcmp(cmd_buffer[0][1], \"-i\") == %d\n", strcmp(cmd_buffer[0][1], "-i") );
printf("cmd_buffer[0][1]: \"%s\"\n", cmd_buffer[0][1]);
生成输出:

strcmp(cmd_buffer[0][1], "-i") == 181
cmd_buffer[0][1]: "–i"

如果
argv[1]
为“-i”,则
strcmp
将返回0。但事实并非如此。仔细看,你会发现它是一个不同的字符“-i”。(更长,多字节。)

您的文本文件包含一些用于
-
的unicode同音字,而不是实际的
-
。这一点很清楚,因为
181+'-'
0xe2
,是3字节字符的前导字节。

这很有帮助,但我能做些什么来解决这个问题?无论是在文本文件中还是在代码中?你的权利我现在看到了区别,关于如何在代码或文本文件中克服这一点的任何建议?@user3459138:使用代码编辑器而不是文字处理器编辑文本文件,或者关闭自动字符替换。然后删除&ndash;并插入a-
cmdfile2
中的破折号显然是UTF-8字节0xE2 0x80 0x93=U+2013 EN破折号(
)。至少,这是我从复制粘贴中得到的;代码中的
-
是常规的U+002D连字符减号。这与其他人在回答中所说的话相呼应。您需要编辑
cmdfile2
并用普通破折号替换en破折号-具体操作方式取决于您选择的编辑器。