2013-03-09 49 views
5

這是打印一個月提醒列表的程序。這是K.N.的一個例子。國王書。我的問題是我無法理解strcmp函數在這個程序中的工作原理。瞭解一個月提醒程序中的strcmp()函數

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

#define MAX_REMIND 50  /* Maximum number of reminders */ 
#define MSG_LEN 60   /* max length of reminders message */ 

int read_line(char str[], int n); 

int main(void) { 
    char reminders[MAX_REMIND][MSG_LEN+3]; 
    char day_str[3], msg_str[MSG_LEN+1]; 
    int day, i, j, num_remind = 0; 

    for(;;) { 
     if(num_remind == MAX_REMIND) { 
      printf("--No space left--\n"); 
      break; 
     } 

     printf("Enter day and reminder: "); 
     scanf("%2d", &day); 
     if(day == 0) 
      break; 
     sprintf(day_str, "%2d", day); 
     read_line(msg_str, MSG_LEN); 

     for(i = 0; i < num_remind; i++) 
      if(strcmp(day_str, reminders[i]) < 0) 
       break; 

     for(j = num_remind; j > i; j--) 
      strcpy(reminders[j], reminders[j - 1]); 

     strcpy(reminders[i], day_str); 
     strcat(reminders[i], msg_str); 

     num_remind++; 
    } 

    printf("\nDay Reminder\n"); 
    for(i = 0; i < num_remind; i++) 
     printf(" %s\n", reminders[i]); 

    return 0; 
} 

int read_line(char str[], int n) { 
    int ch, i = 0; 
    while((ch = getchar()) != '\n') 
     if (i < n) 
      str[i++] = ch; 

    str[i] = '\0'; 
    return i; 
} 

我的理解是,字符串存儲在二維數組中,其中每行都接受來自用戶的字符串。程序首先使用日期(來自用戶的小數點後兩位)並使用sprintf()函數將其轉換爲字符串。然後它將轉換後的字符串日期與存儲在提醒[] []數組中的字符串進行比較。

我不明白它如何比較日期和字符串。 (在這種情況下,它總是返回true,並且每次在i = 0時斷言)。

回答

2

strcmp用於此代碼用於排序。添加一些調試代碼(27行)之後,您將看到由STRCMP產生什麼結果:

for(i = 0; i < num_remind; i++) { 
    printf("%s comparing to %s is %d \n", day_str, reminders[i], strcmp(day_str, reminders[i])); 
    if(strcmp(day_str, reminders[i]) < 0) { 
      break; 
    } 
} 

正如你可以看到循環被中斷時,新進入day_str比從其他任何提醒小存儲的提醒的開始。 獲得以這種方式在下一個用於循環到所有存儲催從num_remind由1個地方轉移到每個(從最後一個元素與i)。 最後這兩條線將day_str和msg_str在正確的地方:

strcpy(reminders[i], day_str); 
strcat(reminders[i], msg_str); 

看看這個Insertion sort瞭解這種排序的。

+0

這不是這樣。這不是解釋代碼的正確論壇。我們應該把OP移到一個可以得到好專家建議的論壇上。代碼審查是由良好的C代碼編寫的,因此他可能在這裏得不到完美的答案。 – 2013-03-09 17:09:37

1

'day'變量是一個整數,它被組成一個格式爲「%2d」的字符串,所以數字6變​​成了「6」。

然後程序遍歷提醒,和休息在此條件下:

if(strcmp(day_str, reminders[i]) < 0) 

STRCMP正在這裏用來確定是否比在提示字符串[我]早些時候在day_str各種各樣的字符串。

提醒[]數組因此按升序排序。此循環在新數據的插入點處中斷。然後它將所有現有的提醒移動到陣列中的一個位置,爲插入新數據騰出空間。

+0

這不是這樣。這不是解釋代碼的正確論壇。我們應該把OP移到一個可以得到好專家建議的論壇上。代碼審查是由良好的C代碼編寫的,因此他可能在這裏得不到完美的答案。 – 2013-03-09 17:10:27