2013-02-25 67 views
6

Đây là triển khai của tôi về mảng hình tròn cho đến nay. Nó được cho là lưu trữ 5 lệnh cuối cùng được nhập vào, bằng cách nhập lệnh thứ 6 vào vị trí thứ 5 và loại bỏ lệnh thứ nhất. Những gì tôi đã quản lý để làm cho đến nay là, để có thể lưu trữ 5 lệnh và in chúng ra. Trên lệnh thứ 6, tôi nhận thấy rằng nó nằm ở vị trí thứ 2 (k=1) của historyArray, nhưng khi gỡ lỗi, k bằng 0 ít nhất sẽ đẩy lệnh cuối cùng ở trên cùng. Nếu bạn có thể đặt tôi vào đúng hướng một lần nữa, tôi sẽ đánh giá cao nó. Đây là một phần của mã.thực hiện mảng vòng tròn

#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); 
} 

Sau khi lời đề nghị (vẫn còn chưa đầy đủ):

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

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

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

Điều này có thể có hoặc không liên quan, nhưng bạn có tự tin rằng bộ đệm của bạn đủ lớn cho bất kỳ chuỗi nào bạn gặp phải không? Nếu không, thì 'get' và' strcpy' sẽ dẫn đến tràn. Bạn nên điều tra 'fgets' và' strncpy' là "an toàn" thay thế. –

+2

Ngoài ra, tôi hoài nghi về 'if (elementCounter <= 5)'; tại sao bạn cần điều đó? –

+0

@OliCharlesworth Bạn nói đúng. Tôi có kế hoạch sửa chữa chúng sau này. 'If ​​(elementCounter <= 5)' được sử dụng để đếm các phần tử trong mảng và tôi sử dụng nó trong mảng in tiếp tục xuống mã. Nó ở đó để nó không in nhiều hơn 5 giá trị. – serge

Trả lời

5

Các lỗi bạn mô tả đang xảy ra vì các dòng:

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

Những gì tôi thấy xảy ra:

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 hành xử như nó được cho là, theo như tôi thấy. Tuy nhiên, khi elementCounter là 5, k = 1.

EDIT: Vấn đề mà tôi thấy là lệnh mới nhất được thêm tại vị trí k, không phải vị trí 0, dựa trên thực hiện của bạn là lệnh gần đây nhất được nhập (dựa trên các mệnh đề khác nhau của if, như điều khoản xử lý các lệnh "thoát" và "lịch sử"). Hãy thử bộ lệnh này, sử dụng thuật toán hiện tại của bạn. Tôi hy vọng rằng nội dung của cột [Danh sách Lệnh] là những gì bạn sẽ thấy ...

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] 

Điều bạn muốn làm là sao chép các phần tử 0-3 và chuyển chúng đến các phần tử 1-4 . Sau đó, chèn lệnh mới tại vị trí 0 trong historyArray. Như vậy, lịch sử của bạn sẽ trông như thế này sau khi điều chỉnh thuật toán của bạn một cách thích hợp:

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

Tôi đã đăng toàn bộ mã để bạn có thể có cái nhìn tốt hơn về những gì đang xảy ra. – serge

+0

Cảm ơn bạn, điều đó giúp ích rất nhiều! –

+0

Cập nhật thông tin dựa trên mã được cập nhật ... –

1

Đây là tôi đã cố gắng và có vẻ như được làm việc như mong đợi:

   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);     
      } 

này, về cơ bản, kiểm tra nếu elementCounter trở thành 6 (có nghĩa là lệnh thứ 6 đã được nhập). Nếu vậy, nó đặt k=5 để lệnh sẽ được nhập vào vị trí cuối cùng của mảng, và sau đó thay đổi 4 giá trị đầu tiên lên một vị trí để chỉ mục 4 trống. Bước cuối cùng sẽ điền vào vị trí bằng lệnh. Nó không phải là đoạn mã thanh lịch nhất nhưng có vẻ như là lừa.

Các vấn đề liên quan