2010-07-15 174 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