2017-01-14 51 views
5

Bir giriş dizesini ';' kullanarak bölmek için bir program yazdım sonlandırıcı olarak ve ';' den sonra dizenin bir kısmını yazdırır. Program, ';' giriş dizesinde geçerli bir terminal komutu değil, aynı zamanda command not found'u yazdırır. Öte yandan, alt dizgi ';' ile takip edildiğinde hiçbir şey yazdırmaz. geçerli bir terminal komutudur ve alt dizini komut olarak yürütür, örn. giriş durumunda "sjhjh; ls" ls komutunu çalıştıracaktır.';' Girişteki karakter yanlış yorumlandı

command not found bölümünden nasıl kurtulurum? İşte kod: aslında iki programları çağırmak komut satırında

your_program_name sjhjh;ls 

: Eğer gibi programı çalıştırmak

#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

Çocuklar, bu soruyu reddetme. Kabuk ve bir uygulama arasındaki aslında oldukça nadir ve ilginç bir örnek. – DyZ

+1

, shell'in ismini –

+2

@DYZ etiketi olarak eklemenizi öneririm. Bu, aslında hata ayıklayıcısını kullanmama veya bir MCVE oluşturmama örneğidir. Aksi halde, metnin asla asıl olarak 'argv' ye ulaşmadığı ve sorunun tamamen farklı bir odağı olabileceği açıktır. – grek40

cevap

14

. Birincisi your_program_name sjhjh (argv[1], "sjhjh") ve ikincisi ls'dur. İhtiyacınız olan şey, komut satırının geri kalanının kabuk tarafından çözülmediğinden emin olmaktır ve bu, düzgün bir şekilde alıntı yaparak gerçekleştirilir:

your_program_name 'sjhjh;ls' 
+0

Ayrıca, OP kodu biraz değiştirebilir, eğer 'eğer (argc <2) '-' ise (argc! = 2) ' Bu, hatayı gösteren olurdu. Sonuçta, kod, tek bir parametreden fazlasını almaz. Eşitlik kontrolü bu nedenle daha iyi olurdu. @Romy, gördüğünüz gibi, sadece kodunuzla daha hassas olmak sizin için hatayı tespit edebilir, hatta onlardan kaçınılabilir. Kendinize sorun, her bir kod satırını yazarken, "tam olarak burada ne elde etmeye çalışıyorum?" – Mawg

+3

@Mawg atlarınızı tutun, 'argc' kontrolü hiçbir şeyi açıklamayacaktır, çünkü argv [1] daha kısa olacaktır (';' ve sonraki metni içermiyor) ancak yine de ilk önce metinde yer alacaktır '; ' – grek40

+0

Beni yakaladın! (+1) Yine de kontrol boşlukları yakalayacak ve bu hatayı yakalamadığı halde, kesinlikle biraz daha iyi bir kod. Ancak ana nokta, belirttiğiniz gibi, bir hata ayıklayıcısını kullanmayı öğrenmektir. – Mawg