2017-01-14 10 views
5

मैंने ';' का उपयोग करके इनपुट स्ट्रिंग को विभाजित करने के लिए एक प्रोग्राम लिखा टर्मिनेटर के रूप में और स्ट्रिंग के हिस्से को प्रिंट करें जो ';' के बाद है। जब भी निम्नलिखित घटते हैं, कार्यक्रम सही आउटपुट दिखाता है ';' इनपुट स्ट्रिंग में वैध टर्मिनल कमांड नहीं है लेकिन command not found प्रिंट करता है। दूसरी तरफ, जब यह सबस्ट्रिंग ';' के बाद होता है तो यह कुछ भी प्रिंट नहीं करता है एक वैध टर्मिनल कमांड है और सबस्ट्रिंग को कमांड के रूप में निष्पादित करता है, उदा। इनपुट के मामले में "sjhjh; ls" यह ls कमांड निष्पादित करेगा।';' इनपुट में चरित्र का गलत व्याख्या किया जा रहा है

मैं command not found भाग से कैसे छुटकारा पा सकता हूं? यहाँ कोड है:

#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

दोस्तों, इस प्रश्न को कम मत करें। यह वास्तव में खोल और एक आवेदन के बीच इंटरप्ले का एक दुर्लभ और दिलचस्प उदाहरण है। – DyZ

+1

एक टैग –

+2

@DYZ के रूप में खोल का नाम जोड़ने का सुझाव देता है, मैं डाउनवोट नहीं करूँगा, लेकिन यह वास्तव में डीबगर का उपयोग न करने या एमसीवीई नहीं बनाने का एक उदाहरण है। अन्यथा यह स्पष्ट होगा कि टेक्स्ट मुख्य रूप से 'argv' तक नहीं पहुंचता है और प्रश्न में पूरी तरह से अलग फोकस हो सकता है। – grek40

उत्तर

14

जब आप अपने प्रोग्राम की तरह निष्पादित करें:

your_program_name sjhjh;ls 
कमांड लाइन पर

, आप वास्तव में दो कार्यक्रमों को लागू। पहला your_program_name sjhjh है (इसलिए, argv[1]"sjhjh" है), और दूसरा ls है। आपको यह सुनिश्चित करने के लिए है कि शेष कमांड लाइन खोल द्वारा अनारक्षित हो जाती है, और इसे ठीक से उद्धृत करके पूरा किया जाता है:

your_program_name 'sjhjh;ls' 
+0

इसके अलावा, ओपी 'if (argc <2) 'to' if (argc! = 2)' बदलकर कोड को थोड़ा कस कर सकता है। , जो त्रुटि दिखाया होगा। आखिरकार, कोड एक पैरामीटर से अधिक नहीं है। इसलिए एक समानता जांच बेहतर रही होगी। @Romy, जैसा कि आप देख सकते हैं, बस आपके कोड के साथ अधिक सटीक होने से आप के लिए त्रुटि का पता लग सकता है, यहां तक ​​कि उनसे बचें। अपने आप से पूछें, जैसे आप कोड की प्रत्येक पंक्ति लिखते हैं, "क्या, बिल्कुल, क्या मैं यहां हासिल करने की कोशिश कर रहा हूं?" – Mawg

+3

@ माउग अपने घोड़ों को पकड़ो, 'argc' चेक कुछ भी प्रकट नहीं करेगा, क्योंकि' argv [1] 'छोटा होगा ('; 'और पाठ के बाद नहीं) लेकिन यह अभी भी पहले' टेक्स्ट से पहले मौजूद होगा; ' – grek40

+0

तुमने मुझे मिल गया! (+1) फिर भी चेक रिक्त स्थान पकड़ लेगा, और, जबकि यह इस त्रुटि को नहीं पकड़ता है, यह निश्चित रूप से थोड़ा बेहतर कोड है। मुख्य बिंदु हालांकि, जैसा कि आपने बताया है, एक डीबगर का उपयोग करना सीखना है। – Mawg

संबंधित मुद्दे