我是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;
}
答案 0 :(得分:1)
此计划存在一些问题。
main
的返回类型。始终写int main()
或int main (int argc, char* argv[])
。启用警告并注意它们。 strrindex
中有未使用的变量。再次,启用警告并注意它们。您希望所有代码都出现零警告。\0
是多余的,编译器会为您添加一个。只需撰写"ould"
,而不是"ould\0"
。index
。这是非法的,index
是string.h
中函数的名称。名为store
的全局数组是多余的,因为您只访问它的最后一个元素。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
。
希望这有帮助!