C程序返回字符串s中最右边的字符串t索引

时间:2015-01-11 05:21:08

标签: c string char

我是C的新手并且尝试编写一个程序来打印字符串s中最右边的char字符串,但是下面的代码总是返回-1,我在for循环中初始化了变量k但是代码直到我才编译初始化k = 0声明它。请看下面的代码并帮我弄清楚我做了什么错误。

#include <stdio.h>
#include <string.h>
int store[100];
int strrindex(char s[], char t[]);
main()
{
    char s[] = "Ah Love! could you and I with Fate conspire\0";
    char t[] = "ould\0";
    int l = strrindex(s, t); 
    printf("Location=%d", l);
}
int index = 0;
int strrindex(char s[], char t[])
{
    int l = strlen(s);
    int k= 0;
    int c = 0;

    for (int i =0; i <l; i++)
    {
        for (int j = i, k = 0; t[k] != '\0'&& s[j] == t[k]; j++, k++)
            ;

        if ((k>0)&&(t[k]=='\0'))
            store[index++] = i;     
    }
    if (index > 0)
        return store[index - 1];
    else
        return -1;
}

4 个答案:

答案 0 :(得分:1)

此计划存在一些问题。

  1. 您不能省略main的返回类型。始终写int main()int main (int argc, char* argv[])。启用警告并注意它们。
  2. strrindex中有未使用的变量。再次,启用警告并注意它们。您希望所有代码都出现零警告。
  3. 字符串文字末尾的
  4. \0是多余的,编译器会为您添加一个。只需撰写"ould",而不是"ould\0"
  5. 你有全局变量。这是不好的。其中一个被称为index。这是非法的,indexstring.h中函数的名称。名为store的全局数组是多余的,因为您只访问它的最后一个元素。
  6. 您有两个变量名为k。一个具有for循环范围,另一个总是0。

答案 1 :(得分:1)

问题是你的for循环中初始化器部分k的重新声明。这样:

int l = strlen(s);
int k= 0; // **DECLARED HERE**
int c = 0;

for (int i =0; i <l; i++)
{
    for (int j = i, k = 0; t[k] != '\0'&& s[j] == t[k]; j++, k++)
    // AND HERE=====^

外部k初始化为0且永远不会更改。因此,即使内部k最终以匹配结束,外部k也永远不会相等。

这样做:

int l = strlen(s);
int c = 0;

for (int i = 0; i <l; i++)
{
    int k = 0;
    for (int j = i; t[k] != '\0'&& s[j] == t[k]; j++, k++)
        ;

这应该可以解决您遇到的直接问题。


替代实施

包含,因为您应该知道根本不需要索引数组:

int strrindex(const char s[], const char t[])
{
    size_t slen = strlen(s);
    size_t tlen = strlen(t);
    int res = -1;

    if (tlen && (tlen <= slen))
    {
        for (size_t i=0; i<=(slen - tlen); ++i)
        {
            const char *rhs = t;
            for (const char *lhs = s+i; *lhs && *lhs == *rhs; ++lhs, ++rhs);

            if (*rhs == 0)
                res = (int)i;
        }
    }
    return res;
}

答案 2 :(得分:0)

内部;循环后面有一个冗余分号(for)。这意味着循环在每次迭代时“执行”一个空块(即,什么也不做),并且在内部if终止后,执行<{1}}语句

删除它,你应该没问题:

for

答案 3 :(得分:0)

在内部if循环的for语句条件中,您已写过

for(int i=0;i<l;i++)
{
  for(int j=i,k=0;(t[k]!='\0' && s[j]==t[k]);j++,k++)
   {
     if((k>0) && (t[k]=='\0'))
           {store[index++]=i;}
}
}

您已撰写t[k]=='\0',这意味着if语句将始终为false。仅当t[k]=='\0'时才会出现这种情况,但由于条件for,内部(t[k]!='\0' && s[j]==t[k])循环将被终止。因此if语句始终为false。因此,index的值永远不会递增,直到结束为零。因此,最终if语句不会被执行,函数strrindex()总是返回-1

希望这有帮助!