Ich schreibe ein C-Programm, das eine Liste von Befehlen aus stdin und exec sie nehmen wird. Ich habe unerwartete Ergebnisse von der Verwendung von strcmp nach dem Einlesen von stdin.C-Programmierung: Unerwartete Ergebnisse von strcmp nach der Verwendung von getline
Hier ist mein Programm 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"));
}
nun diese Ausgabe sehen:
[email protected] ~/Emil
$ gcc test_execvp.c -o test_execvp
[email protected] ~/Emil
$ cat cmdfile2
./addone –i add.txt
./addone
./addone –o add.txt
[email protected] ~/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
Ich verstehe nicht, wie die Zeile:
printf("strcmp(cmd_buffer[0][1], \"-i\") == %d\n", strcmp(cmd_buffer[0][1], "-i"));
die Ausgabe produzieren kann :
strcmp(cmd_buffer[0][1], "-i") == 181
wenn die Zeile:
cmd_buffer[0][1]: "–i"
Die Bindestriche in 'cmdfile2' sind anscheinend UTF-8 Byte 0xE2 0x80 0x93 = U + 2013 EN DASH (' -'). Zumindest bekomme ich das von copy'n'paste; das '-' im Code ist das reguläre U + 002D HYPHEN-MINUS. Dies spiegelt wider, was andere in Antworten gesagt haben. Sie müssen 'cmdfile2' editieren und die Bindestriche durch normale Bindestriche ersetzen - wie Sie das machen, hängt von Ihrem Editor Ihrer Wahl ab. –