2012-11-27 23 views
6
int main(int argc, char **argv) 
{ 
    char input[150]; 
    char change[2] = "cd"; 
    char *directory; 

    while(1) { 
     prompt(); 
     fgets(input, 150, stdin); 

     if(strncmp(change, input, 2) == 0) { 
      directory = strtok(input, " "); 
      directory = strtok(NULL, " "); 

      printf(directory); 
      chdir(directory); 
      perror(directory); 

     } 

     if(feof(stdin) != 0 || input == NULL) { 
      printf("Auf Bald!\n"); 
      exit(3); 
     } 
    } 
} 

जब मैं इसे शुरू करता हूं और "सीडी परीक्षण" टाइप करता हूं तो मुझे "ऐसी कोई फ़ाइल या निर्देशिका नहीं मिलती"। लेकिन निर्देशिका "परीक्षण" है।chdir() - ऐसी कोई फ़ाइल या निर्देशिका

आर्क लिनक्स पर चलता है।

+0

अपनी 'निर्देशिका' स्ट्रिंग को इस तरह की जांचें: 'printf (" directory = [% s] \ n ", निर्देशिका);' यदि आपके नाम पर भटकने वाले या अन्य अवांछित/अदृश्य वर्ण हैं। –

+0

'चार परिवर्तन [2] =" सीडी "' आकार 3 की एक चर के आकार 3 की सरणी असाइन कर रहा है। इसके बजाय 'char change [] =" cd "' का उपयोग करें। –

+0

@ विलियमपर्सेल- असल में, वह 'strncmp (... 2)' का उपयोग कर रहा है, इसलिए यह कानूनी है, हालांकि आपका वैसे भी एक अच्छा अभ्यास है। – rodrigo

उत्तर

4

man page से:

fgets() धारा से आकार वर्णों से ज़्यादा से ज़्यादा एक कम और दुकानों में पढ़ता है उन्हें में बफर द्वारा की ओर इशारा किया। ईओएफ या एक नई लाइन के बाद पढ़ना बंद हो जाता है। यदि कोई नई लाइन पढ़ी जाती है, तो इसे बफर में संग्रहीत किया जाता है।

समस्या आपकी स्ट्रिंग है कि आप fgets() से मिल गया के अंत में एक नई पंक्ति चरित्र '\n' है, आप इसे हटाने की जरूरत:

fgets(input, 150, stdin); 
input[strlen(input)-1] = '\0'; 

इसके अलावा:

char change[2] = "cd"; 

कि change[3] होना चाहिए, यह 2 ("सीडी") + 1 के लिए नल टर्मिनेटर '\0' के लिए है जो स्वचालित रूप से आपके लिए रखा जाता है।

फिर यह काम करना चाहिए।

संपादित:

एक अलग विकल्प बदलने के लिए है strtok() कॉल ऐसी है कि:

directory = strtok(NULL, " \n"); 

इस उपयोगकर्ता कुंजी दर्ज के माध्यम से या EOF (Ctrl के माध्यम से स्ट्रिंग में प्रवेश करती है, तो काम करेंगे + डी लिनक्स पर) चरित्र ... मुझे यकीन नहीं है कि उपयोगकर्ता के लिए दूसरा क्या है ... लेकिन यह चोट नहीं पहुंचा सकता!

+2

कंधे ' टी स्ट्रेटोक (..., "\ n") लिखने के लिए बेहतर होगा, अगर स्ट्रिंग किसी ईओएफ के साथ समाप्त हो जाती है, या कुछ? – rodrigo

+0

@rodrigo - हाँ, अगर कोई ईओएफ था तो बेहतर होगा। मुझे लगता है कि मैं मान रहा था कि उपयोगकर्ता "सीडी " सीडी "के बजाय" ... लेकिन आप कभी नहीं जानते! इसे कवर करने के लिए जवाब संपादित किया। – Mike

+0

आपको बहुत बहुत धन्यवाद। यह अब काम करता है :) – csczigiol

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