2017-01-14 41 views
5

Napisałem program do podzielenia łańcucha wejściowego za pomocą ";" jako terminator i wypisz część łańcucha, która jest po ";". Program pokazuje poprawne wyniki za każdym razem, gdy podąża po ";" w łańcuchu wejściowym nie jest poprawnym poleceniem terminalowym, ale drukuje także command not found. Z drugiej strony, nie drukuje niczego, gdy podłańcuch poprzedzony jest przez ";" jest poprawnym poleceniem terminalowym i wykonuje podciąg jako polecenie, np. w przypadku wprowadzenia "sjhjh; ls" wykona polecenie ls. W jaki sposób pozbyć się części? Oto kod:The ';' znak na wejściu jest źle interpretowany

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    char * input; 
    char * str; 
    char * word; 
    char terminator = ';'; 

    if (argc < 2) { 
     fprintf(stderr,"ERROR, no string provided\n"); 
     exit(1); 
    } 

    input = argv[1]; 
    word = strchr(input, terminator); 
    if (word != NULL) printf("%s\n", word); 
    return 0; 
} 
+1

Chłopaki, nie zgłaszajcie tego pytania. Jest to dość rzadki i interesujący przykład wzajemnego oddziaływania powłoki z aplikacją. – DyZ

+1

sugeruje dodanie nazwy powłoki jako znacznika. –

+2

@DYZ Nie odrzucę, ale jest to właściwie przykład nieużywania debuggera lub tworzenia MCVE. W przeciwnym razie byłoby jasne, że tekst nigdy nie osiąga "argv" w głównym, a pytanie może mieć zupełnie inny punkt widzenia. – grek40

Odpowiedz

14

Po uruchomieniu programu, takich jak:

your_program_name sjhjh;ls 

w linii poleceń, to rzeczywiście powoływania dwa programy. Pierwszy to your_program_name sjhjh (czyli argv[1] jest "sjhjh"), a drugi to ls. Potrzebne jest upewnienie się, że reszta wiersza poleceń jest niezauważana przez powłokę, co można uzyskać, prawidłowo cytując:

your_program_name 'sjhjh;ls' 
+0

Również OP może nieco zacieśnić kod, zmieniając 'if (argc <2)' na 'if (argc! = 2)' , który pokazałby błąd. W końcu kod nie obsługuje więcej niż jednego parametru. W związku z tym kontrola równości byłaby lepsza. @Romy, jak widzisz, bycie bardziej precyzyjnym z kodem może wykryć błąd, nawet go uniknąć. Zapytaj siebie, jak piszesz w każdym wierszu kodu, "co dokładnie staram się tutaj osiągnąć?" – Mawg

+3

@Mawg trzymaj konie, sprawdzanie 'argc' nie ujawni niczego, ponieważ' argv [1] 'będzie krótsze (nie zawierające"; "i następującego po nim tekstu), ale nadal istniałoby z tekstem przed pierwszym"; " – grek40

+0

Masz mnie! (+1) Wciąż sprawdzanie zatrzymywałoby spacje i, mimo że nie przechwytuje tego błędu, jest to z pewnością nieco lepszy kod. Najważniejszą kwestią, jak zauważyłeś, jest nauka korzystania z debuggera. – Mawg