2016-05-17 4 views
3

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" 
+0

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. –

Antwort

2

Wenn argv[1] wurden "i", dann strcmp würde 0 zurück Aber es ist nicht:

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

die Ausgabe erzeugt. Schauen Sie genau hin und Sie werden sehen, dass es "– i" ist, was ein anderes Zeichen ist. (Es ist länger und Multibyte.)

+0

Ihr Recht Ich sehe jetzt den Unterschied, einen Vorschlag, wie Sie dies entweder im Code oder Textdatei zu überwinden? – user3459138

+0

@ user3459138: Bearbeiten Sie die Textdatei mit einem Code-Editor anstelle eines Textverarbeitungsprogramms, oder deaktivieren Sie die automatische Zeichenersetzung. Löschen Sie dann die – und fügen Sie ein - – rici

2

Ihre Textdatei enthält einige Unicode-Homoglyph für - eher als eine tatsächliche -. Dies ist klar, da 181+'-'0xe2 ist, das führende Byte für ein 3-Byte-Zeichen.

+0

Das ist hilfreich, aber was kann ich tun, um das zu beheben? Entweder in der Textdatei oder im Code? – user3459138

Verwandte Themen