【问题标题】:C programming: Unexpected results from strcmp after using getlineC 编程:使用 getline 后 strcmp 的意外结果
【发布时间】:2016-09-13 00:41:51
【问题描述】:

我正在编写一个 C 程序,它将从标准输入获取命令列表并执行它们。从标准输入读取后,我使用 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") );

}

现在看到这个输出:

Emil@EMIL-HP ~/Emil
$ gcc test_execvp.c -o test_execvp

Emil@EMIL-HP ~/Emil
$ cat cmdfile2
./addone –i add.txt
./addone
./addone –o add.txt

Emil@EMIL-HP ~/Emil
$ ./test_execvp < cmdfile2
cmd_buffer[0][0]: "./addone"
cmd_buffer[0][1]: "–i"
cmd_buffer[0][2]: "add.txt"
strcmp(cmd_buffer[0][1], "-i") == 181
strcmp(cmd_buffer[0][1], "-o") == 181

我不明白怎么行:

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

可以产生输出:

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

如果行:

printf("cmd_buffer[0][1]: \"%s\"\n", cmd_buffer[0][1]);

产生输出:

cmd_buffer[0][1]: "–i"

【问题讨论】:

  • cmdfile2 中的破折号显然是 UTF-8 字节 0xE2 0x80 0x93 = U+2013 EN DASH ()。至少,这就是我从复制粘贴中得到的;代码中的- 是常规的 U+002D HYPHEN-MINUS。这与其他人在答案中所说的相呼应。您需要编辑 cmdfile2 并将短破折号替换为普通破折号 - 具体操作方式取决于您选择的编辑器。

标签: c getline strcmp


【解决方案1】:

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

【讨论】:

  • 你的权利,我现在看到了不同之处,关于如何在代码或文本文件中克服这个问题有什么建议吗?
  • @user3459138:使用代码编辑器而不是文字处理器编辑文本文件,或关闭自动字符替换。然后擦除 –并插入 -
【解决方案2】:

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

【讨论】:

  • 这很有帮助,但我能做些什么来解决这个问题?在文本文件中还是在代码中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 2019-11-29
  • 2021-12-20
相关资源
最近更新 更多