2016-03-24 95 views
-1
#include <stdio.h> 
#include <string.h> 
#include <conio.h> 

char str[100]; 

int main(void) 
{ 
    int i, t, j, len; 

    printf("Enter string: "); 
    scanf("%[^\n]ed", str); 

    len = strlen(str); 

    str[len] = ' '; 

    for (t = 0, i = 0; i < strlen(str); i++) 
    { 
     if ((str[i] == ' ') && (str[i - 1] == 'd') && (str[i-2]=='e')) 
     { 
      for (j = t; j < i; j++) 
       printf("%c", str[j]); 
      t = i + 1; 
      printf("\n"); 
     } 
     else 
     { 
      if (str[i] == ' ') 
      { 
       t = i + 1; 
      } 
     } 
    } 
} 

該程序在用戶插入後應找到以「ed」結尾的單詞。如果用戶沒有插入以ed結尾的單詞,則應該打印一條消息,如「沒有ed的單詞」。我試圖補充一點:查找字符串的最後一個字母

if ((str[i] == ' ') && (str[i - 1] == 'd') && (str[i-2]=='e')=NULL) 
printf("There no words with ed"); 

但它沒有奏效。

+0

從修改'str [len] ='';'開始'str [len-1] ='';'。數組索引在C中以零開頭。str [len] =''用空格替換零終止符,從而導致未定義的行爲。 –

+1

當'i'爲0時訪問'str [i - 1]'也會導致未定義的行爲。 –

+0

@WhozCraig'str'是全局變量。 (str用0初始化) – BLUEPIXY

回答

-1

所有你需要做一個標誌,如果你找到你的匹配增加;如果你想要匹配的數量;或者只是爲了設置;如果你只想知道狀態。

以下是您的代碼包含此標誌稱爲「找到」,檢查。

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

char str[100]; 

int main(void) 
{ 
    int i, t, j, len; 
    int found = 0; 
    printf("Enter string: "); 
    scanf("%[^\n]ed", str); 

    len = strlen(str); 

    str[len] = ' '; 

    for (t = 0, i = 0; i < strlen(str); i++) 
    { 
     if ((str[i] == ' ') && (str[i - 1] == 'd') && (str[i-2]=='e')) 
     { 
      for (j = t; j < i; j++) 
       printf("%c", str[j]); 
      t = i + 1; 
      printf("\n"); 
      found++; 
     } 
     else 
     { 
      if (str[i] == ' ') 
      { 
       t = i + 1; 
      } 
     } 
    } 
    if(found == 0) 
     printf("NotFound\r\n"); 
    return 0; 
} 

另外,我有一個評論代碼:

  • str[len] = ' '將替換「」這是不能接受的字符串NULL終止的說法,你應該確保始終是你的最後一個元素您的字符串數組爲NULL(0)
3

您需要在編寫任何代碼之前仔細考慮算法的邏輯。如果你想找到以「ed」結尾的單詞,那麼你顯然需要在字符串的末尾搜索,而不是在開頭。也只有兩個字母,它們總是位於最後,按照指定的順序,所以爲什麼你需要一個循環開始?

另外,如何初始化i 0,然後使用一個包含代碼如i-1的循環體呢?

得到一個字符串的最後一個字母,你會做這樣的:

size_t last_index = strlen(str) - 1; // -1 because C arrays are 0-indexed. 
char last_char = str[last_index]; 

而且得到之前的字符,使用last_index-1。然後,簡單地將這兩個字符與'e'和'd'進行比較。不需要循環。

+2

注意,如果字符串實際上是零長度的,那麼這兩行代碼將會脫離UB。具有零長度字符串的64位平臺將爲'last_index'的值存儲'18446744073709551615'。 – WhozCraig

+0

@WhozCraig是的,如果'str'不是字符串等等,它們也會導致UB。所以檢查用戶輸入。這是一個與算法無關的獨立任務。 – Lundin

1

首先第一件事情,你作爲你的預期,當輸入是像「我愛你」,在這種情況下,整條生產線被讀入,忽略了scanf("%[^\n]ed", str);可能無法正常工作「ed」中的格式字符串。

事實上,還有另一種方法來實現你的要求,這很簡單。

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

int main(void) 
{ 
    char str[100], *substr; 
    size_t len; 
    puts("Enter string: "); 
    fgets(str, 100, stdin); 
    substr = strtok(str, " "); 
    while(substr) 
    { 
     len = strlen(substr); 
     if (substr[len - 2] == 'e' && substr[len - 1] == 'd') 
      puts(substr); 
     substr = strtok(NULL, " "); 
    } 
} 

我不認爲你自己的代碼可以比使用strtok()的代碼更好。請記住,利用標準庫函數將使您的生活更輕鬆。

相關問題