2013-02-25 86 views
6

यह अब तक एक परिपत्र सरणी का मेरा कार्यान्वयन है। यह 5 वें स्थान पर 6 वें आदेश दर्ज करके और 1 को छोड़कर दर्ज किए गए अंतिम 5 आदेशों को संग्रहीत करना है। मैंने अब तक क्या करने में कामयाब रहा है, 5 आदेशों को स्टोर करने और उन्हें प्रिंट करने में सक्षम है। 6 वें आदेश पर, मैंने देखा कि यह historyArray की दूसरी स्थिति (k=1) में जाता है, लेकिन जब डीबगिंग, k0 के बराबर था जो कम से कम अंतिम कमांड को कम से कम दबाएगा। यदि आप मुझे सही रास्ते में फिर से रख सकते हैं, तो मैं इसकी सराहना करता हूं। यहां कोड का हिस्सा है।परिपत्र सरणी कार्यान्वयन

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

int main (int argc, char *argv[]) 
{ 
    int i=0; 
    int j=0; 
    int k=0; 
    int tempIndex = 0; 
    int elementCounter = 0; 

    char inputString[100]; 
    char *result=NULL; 
    char delims[] = " "; 
    char historyArray[5][20] = {0}; 
    char tokenArray[20][20] ; 
    char hCommand[1][20]; 

    do 
    { 
     j = 0; 

     printf("hshell>"); 
     gets(inputString); 

     //skip writing "history" in historyArray 
     if (strcmp(inputString,"history")!= 0) 
     { 
      strcpy (historyArray[k], inputString); 
     } 

     k = (k+1) % 5; 
     if (elementCounter <= 5) 
      elementCounter++; 

     // Break the string into parts 
     result = strtok(inputString, delims); 

     while (result!=NULL) 
     { 
      strcpy(tokenArray[j], result); 
      j++; 
      result= strtok(NULL, delims);     
     } 

     if (strcmp(tokenArray[0], "exit") == 0) 
      return 0; 

     if (strcmp(tokenArray[0], "history") == 0) 
     { 
      if (j>1) 
      { 
       tempIndex = atoi(tokenArray[j]); 
       puts(tempIndex); 
      } 
      else 
      { 
       for (i=0; i<elementCounter-1;i++) 
        printf("%i. %s\n", i+1, historyArray[i]); 
      } 
     } 
     else 
     { 
      printf("Command not found\n"); 
     } 
    } while (1); 
} 

के बाद सुझाव (अब भी अपूर्ण):

  j = 0; 
     //elementCounter = 0; 
     printf("327>"); 
     gets(inputString); 

     strcpy (historyArray[k], inputString); 
     k = (k+1) % 5; 

     if (elementCounter <= 5) 
     {   
      elementCounter++;     
     } 
+0

यह संबंधित हो सकता है या नहीं भी हो सकता है, लेकिन क्या आपको विश्वास है कि आपके बफर किसी भी स्ट्रिंग के लिए पर्याप्त हैं? यदि नहीं, तो 'हो जाता है' और 'strcpy' ओवरफ्लो का कारण बन जाएगा। आपको 'fgets' और' strncpy' को "सुरक्षित" विकल्पों के रूप में जांच करनी चाहिए। –

+2

इसके अलावा, मैं 'if (elementCounter <= 5)' के बारे में संदेह कर रहा हूं; आपको इसकी आवश्यकता क्यों है? –

+0

@ ओली क्रिसल्सवर्थ आप सही हैं। मैं बाद में उन्हें ठीक करने की योजना बना रहा हूं। 'If ​​(elementCounter <= 5) 'सरणी में तत्वों की गणना करने के लिए प्रयोग किया जाता है और मैंने इसे कोड के नीचे सरणी प्रिंटिंग में उपयोग किया। ऐसा इसलिए है कि यह 5 से अधिक मान मुद्रित नहीं करता है। – serge

उत्तर

5

बग आपके द्वारा बताई गई लाइनों की वजह से हो रहा है:

k = (k + 1) % 5; 
elementCounter++; 

मैं क्या हो रहा देखें:

k initial | calculation | k result | elementCounter 
0   (0 + 1) % 5 1 % 5 = 1 1 
1   (1 + 1) % 5 2 % 5 = 2 2 
... 
4   (4 + 1) % 5 5 % 5 = 0 5 
0   (0 + 1) % 5 1 % 5 = 1 5 

k जहां तक ​​मैं देख सकता हूं, वैसे ही व्यवहार कर रहा है। हालांकि, जब elementCounter 5 है, के = 1.

संपादित करें: मुझे जो समस्या दिखाई देती है वह यह है कि नवीनतम आदेश k पर जोड़ा जा रहा है, स्थिति 0 नहीं, जो आपके कार्यान्वयन के आधार पर सबसे हालिया आदेश दर्ज किया गया है (विभिन्न if क्लॉज पर आधारित, जैसे "बाहर निकलने" और "इतिहास" आदेशों को संसाधित करता है)। अपने वर्तमान एल्गोरिदम का उपयोग करके, आदेशों के इस सेट को आज़माएं। मैं उम्मीद [कमान सूची] स्तंभ की सामग्री आप क्या देखेंगे हैं कि ...

Command # | Command Text | [Command List] 
0   (null)   [] 
1   Login   [Login] 
2   History  [Login,History] 
3   Skynet   [Login,History,Skynet] 
4   ps -al   [Login,History,Skynet,ps -al] 
5   Skynet   [Login,History,Skynet,ps -al,Skynet] 
6   Exit   [Exit,History,Skynet,ps -al,Skynet] 

आप क्या करना चाहते हैं क्या, कॉपी तत्वों 0-3 है, और उन्हें तत्वों 1-4 को स्थानांतरित । फिर, historyArray में स्थिति 0 पर नया आदेश डालें। इस प्रकार, अपने इतिहास उचित रूप से अपने एल्गोरिथ्म समायोजित करने के बाद इस तरह दिखना चाहिए:

Command # | Command Text | [Command List] 
0   (null)   [] 
1   Login   [Login] 
2   History  [History,Login] 
3   Skynet   [Skynet,History,Login] 
4   ps -al   [ps -al,Skynet,History,Login] 
5   Skynet   [Skynet,ps -al,Skynet,History,Login] 
6   Exit   [Exit,Skynet,ps -al,Skynet,History] 
+1

मैंने पूरा कोड पोस्ट किया है ताकि आप क्या हो रहा है पर एक बेहतर दृश्य प्राप्त कर सकें। – serge

+0

धन्यवाद, यह बहुत मदद करता है! –

+0

अद्यतन कोड के आधार पर जानकारी के साथ अपडेट किया गया ... –

1

यह मैंने कोशिश की है और यह काम करने की उम्मीद के रूप में लगता है:

   j = 0; 
      //elementCounter = 0; 
      printf("hshell>"); 
      gets(inputString); 

      strcpy (historyArray[k], inputString); 
      k = (k+1) % 5; 

      if (elementCounter <= 5) 
      {   
       elementCounter++;     
      } 

      if (elementCounter ==6) 
      { 
       k = 5; 
       for (i=0; i<5; i++) 
       { 
        strcpy(historyArray[i], historyArray[i+1]); 
       } 
       strcpy (historyArray[4], inputString);     
      } 

यह मूल रूप से इसकी जांच करता है elementCounter हो जाता है 6 (जिसका अर्थ है कि 6 वां कमांड दर्ज किया गया है)। यदि ऐसा है, तो यह k=5 सेट करता है ताकि आदेश सरणी की अंतिम स्थिति में दर्ज किया जाएगा, और उसके बाद पहले 4 मानों को इंडेक्स 4 खाली छोड़कर एक स्थिति को स्थानांतरित करें। अंतिम चरण कमांड के साथ स्थिति भरता है। यह कोड का सबसे सुंदर टुकड़ा नहीं है लेकिन यह चाल चल रहा है।