簡體   English   中英

C編程:使用getline后strcmp的意外結果

[英]C programming: Unexpected results from strcmp after using getline

我正在編寫一個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") );

}

現在看到這個輸出:

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"

如果argv[1]是“-i”,則strcmp將返回0.但事實並非如此。 仔細觀察,你會發現它是“-i”,這是一個不同的角色。 (它更長,更多字節。)

你的文本文件包含一些unicode homoglyph -而不是實際的- 這很清楚,因為181+'-'0xe2 ,是3字節字符的前導字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM