2009-10-19 56 views
1

嘿所有,我試圖找到一個字符或一個字符串中的字符數字位置。我能夠弄清楚如何查看字符串「abcd」中的字符「a」,但如果放入「abcda」,它只打印出0,這意味着它只計算第一個實例。我想查找該字符串的最後或最右邊的發生。這是我到目前爲止有:在C中查找一個角色的最重要的發生?

#include <stdio.h> 


main(){ 

char s[20]; 
char t[20]; 
int pp; 
printf("Enter a FULL string: \n"); 
scanf("%s", s); 

printf("Enter what you want to find: \n"); 
scanf("%s", t); 

pp = strindex(s, t); 

printf("%d", pp); 

} 



/* string index */ 

int strindex(char s[], char t[]){ 

int i, j, k, c; 

for (i = 0; s[i] != '\0'; i++){ 

for (j=i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++); 
if (k > 0 && t[k] == '\0') 

return i; 




} 
return -1; 

     } 

它可能很簡單,但我一直在努力,並絞盡腦汁,沒有什麼是走出來的吧。非常感謝!

+0

我想這個代碼有一些格式問題。如果你想要最右邊的字符,你的問題的答案是從字符串的結尾開始,而不是開始。 – 2009-10-19 23:20:38

+0

這是一個功課問題,順便說一句嗎? – 2009-10-19 23:21:20

+0

是的,這是我的作業的一部分,但不是整個事情:) – 2009-10-19 23:25:36

回答

5

相反,只要你找到了一個發生在返回我的,店另一個變量。

即。更換 return i;lastOccurence = i;

lastOccurrence應在功能開始被初始化爲-1,那麼在年底返回。另外,你的內循環需要檢查s [j]!='\ 0',或者當你搜索的時候,你將要經過輸入字符串的末尾。

8

您正在尋找strrchr功能。

char *str = strrchr("abcda", 'a'); 
int index = strlen("abcda")-strlen(str); 
2

尋找第一個 '一':

strchr("abcda", 'a'); // == "abcda"'s pointer 

尋找最後的 'A':我

strrchr("abcda", 'a'); // == "abcda"'s pointer + 4 
0

正如其他答案已經表明,有一些方法(家庭作業)。

首先將實際尋找一個標準的庫函數,已經爲你做了這項工作。在UNIX或Linux系統上,您可能會發現使用man -k string並掃描字符串函數列表中的單詞,例如find,search和locate。從那裏你可能已經找到了strchr()strrchr()的功能。這些後者完全符合你的要求。

假設你的老師不會接受這樣一個簡單的解決方案,那麼你有兩個明顯的方法......掃描字符串中的「向前」,始終記住你最近看到的目標角色,或者掃描「向後「通過字符串,並在您第一次看到目標角色時突破循環。

作業的肉在於如何掃描(迭代)字符串,因爲它們是在C中實現的。可悲的事實是,向後掃描字符串沒有好處(除非您已給出長度或指針到字符串的末尾以及頭到尾)。如果你打電話strlen()或更安全的strnlen()(這是一個常見的擴展,但在技術上不是標準的C庫函數)......那麼你已經隱含地招致了全字符串掃描的成本/開銷)。

因此,對此賦值唯一合理有效的方法是向前掃描字符串,跟蹤最近發現的匹配字符,直到找到字符串的末尾(一個ASCII NUL字符)。正如Trevor指出的那樣,使用-1的「哨兵」值來表示沒有找到目標實例的情況。

0

它看起來像日期的答案忽略了一個事實,即您要搜索字符或字符。所以這裏有一個簡單的解決方案,使用你定義的接口,允許搜索一個字符串。對不起,我還沒有試過編譯和測試這個。

int strindex(const char s[], const char t[]) 
{    
    int ret = -1; /* return -1 if target not found */ 
    int len1 = strlen(s); 
    int len2 = strlen(t); 
    if(len1 >= len2) 
    { 
     int i; 
     for(i=len1-len2; i>=0; i--) 
     { 
      if(0 == memcmp(s+i,t,len2)) 
      { 
       ret = i; /* found target t at idx i */ 
       break;   
      } 
     } 
    } 
    return ret;  
} 
相關問題