[英]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.