यह अब तक एक परिपत्र सरणी का मेरा कार्यान्वयन है। यह 5 वें स्थान पर 6 वें आदेश दर्ज करके और 1 को छोड़कर दर्ज किए गए अंतिम 5 आदेशों को संग्रहीत करना है। मैंने अब तक क्या करने में कामयाब रहा है, 5 आदेशों को स्टोर करने और उन्हें प्रिंट करने में सक्षम है। 6 वें आदेश पर, मैंने देखा कि यह historyArray
की दूसरी स्थिति (k=1
) में जाता है, लेकिन जब डीबगिंग, k
0
के बराबर था जो कम से कम अंतिम कमांड को कम से कम दबाएगा। यदि आप मुझे सही रास्ते में फिर से रख सकते हैं, तो मैं इसकी सराहना करता हूं। यहां कोड का हिस्सा है।परिपत्र सरणी कार्यान्वयन
#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++;
}
यह संबंधित हो सकता है या नहीं भी हो सकता है, लेकिन क्या आपको विश्वास है कि आपके बफर किसी भी स्ट्रिंग के लिए पर्याप्त हैं? यदि नहीं, तो 'हो जाता है' और 'strcpy' ओवरफ्लो का कारण बन जाएगा। आपको 'fgets' और' strncpy' को "सुरक्षित" विकल्पों के रूप में जांच करनी चाहिए। –
इसके अलावा, मैं 'if (elementCounter <= 5)' के बारे में संदेह कर रहा हूं; आपको इसकी आवश्यकता क्यों है? –
@ ओली क्रिसल्सवर्थ आप सही हैं। मैं बाद में उन्हें ठीक करने की योजना बना रहा हूं। 'If (elementCounter <= 5) 'सरणी में तत्वों की गणना करने के लिए प्रयोग किया जाता है और मैंने इसे कोड के नीचे सरणी प्रिंटिंग में उपयोग किया। ऐसा इसलिए है कि यह 5 से अधिक मान मुद्रित नहीं करता है। – serge