2010-07-15 171 views
0

如何比較一個字符串從中間(或其他點,但不是開始)到另一個字符串? 像我有一個字符串 str1 [] =「我是天才」; 現在,如果我想找到一個單詞,我應該如何比較它與單詞?例如這個詞是我。 這裏是我did.Its有點笨,但完美的作品:d比較字符串(來自其他索引而不是0)

#include<stdio.h> 

    #include<string.h> 
    void print(char string[]); 
    int main() 
{ 
    int i; 
    char string1[20]; 
    printf("Enter a string:"); 
    gets(string1); 
    print(string1); 
    return 0; 
    getch(); 
} 
void print(char string[]) 
{ 
    int i,word=1,sum=0,x; 

    for(i=0; ;i++) 
    { 
    sum++; 

    if(string[i]==' ') 
    { 
     printf("Word#%d:%d\n",word,sum-1); 
     sum=0; 
     word++; 
    }/* if ends */ 
    if(string[i]=='\0') 
    { // program sai kaam karnay k liye ye code yahan bhi paste hona chahyey 
     printf("Word#%d:%d\n",word,sum-1); 
     sum=0; 
     word++; 
     break; 
    } 
    }/* for ends*/ 


} 
+0

請注意,找到一個字符串中的單詞不是用字符串比較來執行,而是用有限狀態機來執行(http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80 %93Pratt_algorithm) – 2010-07-15 11:05:51

回答

4

使用strncmp()

strncmp(whereToFind + offsetToStartAt, patternToFind, patternLength); 
+0

在哪裏可以找到我寫的str [5](根據我的示例),那麼我已經給出了str5的值而不是str5的地址,它將如何比較下一個元素?怎麼樣&str [5] – 2010-07-15 10:59:08

+0

在那裏傳遞「str + 5」。 – sharptooth 2010-07-15 11:13:17

+0

不是通過地址更好的選擇? – 2010-07-15 11:24:56

-2

您可以使用字符串解析成字,並將其存儲在新的字符數組/指針。

或者

假設你要查找的字符串 「AM」 存儲在PTR * STR2。

  1. 您使用索引[]從STR1,直到你STR2
  2. 找到索引0匹配的字符一旦你找到一個匹配的增量兩個指針,直到你到達STR2的結束,比較整個字符串開始比較。
  3. 如果再沒有比賽繼續查找字符在索引0 STR2 STR1中從地方,你進入第2步

或者

你必須使用兩個dimensinal陣列。

char str[3][10] = { "i","am","2-darray"}; 

這裏str [1]將包含「am」。這就是假設你想要得到一個字符串的單詞。

編輯:你移除從OP

點分流
+0

這是一個不好的建議(使一個微不足道的問題變成一個困難的問題),似乎不回答實際問題... – 2010-07-15 10:59:23

+0

@R ..是的,它甚至不接近OP。現在編輯它。 – 2010-07-15 13:22:33

-1

一種選擇使用

size_t strspn(char *s1, const char *s2) /* from #include <string.h> */ 
*returns the length of the longest substring of s1 that begins at the start of s1 and consists only of the characters found in s2. 

如果它返回零比沒有子。

+0

這是** NOT **問題的要求。 'strspn'將's2'視爲一組**字節,並返回在's2'中找到的's1'中的前導字節數(只要找到不在集合中的字符就立即停止)。 – 2010-07-15 11:00:57

4

如果你想找到一個字符串的子串,使用功能strstr()

char *p = strstr(str1, "am"); 

if (p != NULL) 
{ 
    // p now points to start of substring 
    printf("found substring\n"); 
} 
else 
{ 
    printf("substring not found\n"); 
} 
1

由於這是功課我假設你不能使用標準的功能,所以我能想到的兩種解決方案:

  1. 斯普利特所有的話到鏈接 列表,那麼就比較每個字符串 ,直到你找到你的話。
  2. 只需使用一個for循環,開始在 開始,你可以使用[]到 幫助迅速通過串,所以 instr[3]將是第四 字符,因爲索引是從零開始 。那麼你只要看看你是否還在你的話。

您可以使用(2)做的優化,但我不想爲您做功課。 :)

+4

請不要鼓勵像解決方案1中那樣思考......這種「讓我們用一個複雜的數據結構代替簡單的易於處理的數據結構」就是爲什麼現在有這麼多臃腫的垃圾。當然這對於作業練習可能並不重要,但是開始時卻是一條糟糕的道路...... – 2010-07-15 11:06:27

+0

豎起大拇指給R先生:D – 2010-07-15 11:19:33

+1

@R - 選項1只是給出一些選擇,它會更復雜,但稍後知道如何做到這一點很有用,因爲如果速度很重要,您可以構建一個二叉樹,並將每個字母作爲單獨的節點,但這取決於他在此作業中想要做什麼。 – 2010-07-15 12:01:07

2

如果你想在指數i1比較字符串s1的剩餘部分開始字符串s2開始i2的其餘部分,它很容易:

result = strcmp(s1+i1, s2+i2); 

如果你想看看的子串s1i1開始字符串匹配s2,嘗試:

result = strcmp(s1+i1, s2); 

或:

result = strncmp(s1+i1, s2, strlen(s2)); 

取決於你是否想要的s1整個其餘部分相匹配,或者只是s2部分長度相等匹配(即s1是否包含s2截至i1位置開始的子字符串。

如果你想搜索爲子字符串,請使用strstr