2010-07-04 148 views
2

更正代码:查找字符串T的最右边出现,在一个字符串s

int strrindex(char *s, char *t) { 
    int i, j, k, p; 

    i = -1; 
    for (k = 0; s[k] != '\0'; k++) { 
    if (strlen(s) < strlen(t)) break; 
    if (s[k] == t[0]) { 
     for (p = k; s[p] != '\0'; p++) { 
    j = p; 
     while (s[j] != '\0' && s[j] == t[j-k] && t[j-k] != '\0') { j++; } 
     if (t[j-k] != '\0') { break; } 
    i = k; 
     } 
    } 
    } 

    printf("%d\n", i); 
    return 0; 
} 
+8

第一步:选择更好的变量名称。我推荐至少*两个字符,甚至三个字符。:) – 2010-07-04 05:09:36

+0

可能重复的[是否有反向fn()为strstr](http://stackoverflow.com/questions/1634359/is-there-a-reverse-fn-for-strstr) – Joshua 2010-07-04 05:41:38

回答

0

我认为这应该工作:

int strrindex(char *s, char *t) { 

    int i = -1; 
    int j = 0; 
    int k = 0; 
    for (; s[k]; k++) { 
    if(!t[j]) { 
     i = k - j; 
     j = 0; 
    } 
    if (s[k] != t[j]) 
     j = 0; 
    else 
     j++; 
    } 
    if(!t[j + 1]) 
    i = k - j - 1; 

    return i; 
} 
+0

真的不想要答案:)但是,谢谢 – lame 2010-07-04 05:17:32

+0

这可能不是最终答案,因为我没有测试它(可能有一个错误...)。但它是一个只使用一个循环的替代方法:) – 2010-07-04 05:18:16

+0

呵呵。我们都是这样开始的:)下一次你做类似的事情,它可能只会花你几个小时;)另外,正如其他人所建议的,尝试使用更多的描述性变量名称(我没有好的榜样......)我真的怀疑它会适用于任何边界案件(例如,你是否尝试使用相同的字符串?)。 – 2010-07-04 05:25:20

0
  • 你遍历p正在索引都s[p]t[p]。这是不正确的,因为它们都是不同的指数。
  • 您的if (s[p] != t[p] ...) i = -1;没有效果,因为您立即将其设置为k
+0

将相应修改并回报。谢谢 – lame 2010-07-04 05:16:55

1
for (p = k; s[p] != '\0'; p++) { 
    while (s[p] == t[p] && t[p] != '\0') { p++; } 

在这一点上,你是比较字符串s用绳子t开始p位置为0位置开始所以它不应该是t[p],而是t[p - k]

if (s[p] != t[p] || t[p] != '\0') { i = -1; } 

你不需要这个在所有 - 如果当前部分不匹配,你只是离开i在最后一场比赛。 (如果到目前为止还没有匹配的话,反正是-1)

+0

你不需要那么长的'if'语句。试试这个:'if(t [p-k] =='\ 0')i = k;' - 如果所有字符匹配,基本上接受当前子字符串。 – casablanca 2010-07-04 05:27:47

0

你的代码有几个bug。以下是我找到的那些:

  1. 您使用p作为s的入口,作为t开头的索引。你想引用t [p-k]来代替。
  2. 在inner while循环中使用p会干扰for循环中p的操作。事实上,你不需要p上的for循环,因为外循环用于循环遍历s。
  3. 当你到达s的末尾时,while循环没有任何警惕,所以很容易跑出s的末尾(在s的末尾有一个部分匹配的t)。
  4. (s [p]!= t [pk] || t [pk]!='\ 0')将在t [pk] =='\ 0'时计算为true,这是错误的– s停止后继续前进。你可以将它简化为(t [p-k]!='\ 0')。
  5. 将我设为-1会消除您之前发现的任何查找。这是错误的–无效匹配不应使先前的有效匹配无效。如果你摆脱了额外的内循环,这可以变成一个continue语句。
  6. i = k需要一个else子句,因此它不会消除i = -1,或者i = -1需要中止/继续当前迭代。
+0

嗯。那么,你解决了其中一个。 :-P – 2010-07-04 05:36:52

+0

1)刚才注意到内部for循环是不必要的(修改答案),2)将j = p放入测试中是IMO不良风格。 – 2010-07-04 05:49:34