当我运行我为#str;'编写的程序时,我一直收到错误。 (当一个字符串出现在另一个字符串的末尾时,strlen返回1)。我猜它是第一个给出错误的while循环,因为当我放printf("%c\n", *s);
而不是空;
时,它就可以了。语法???
#include <stdio.h>
int strend(char *s, char *t)
{
int len;
int dummy;
while ( *s++ )
; // why error???
while ( *t++ )
len++;
for ( ; len>0 ; len--)
{
if ( *(s-len) != *(t-len) )
return 0;
}
return 1;
}
int main() {
char one[] = "I 0dont like youa";
char two[] = "ke youa";
printf("%d\n", strend(one, two));
}
答案 0 :(得分:4)
首先你忘了初始化len,你应该用0初始化它。
int len=0;
其次使用:
while ( *s )
s++; // s should be incremented only if *s is not 0.
while ( *t )
{
t++; //Same issue here.
len++;
}
答案 1 :(得分:2)
首先,本地变量len未初始化
int len;
因此该函数已经有未定义的行为。
循环后的第二个
while ( *s++ );
while ( *t++ ) len++;
两个指针指向超出每个字符串的终止零点。结果这个比较(以及for循环本身)
if ( *(s-len) != *(t-len) )
无效。 确实让我们假设我们有
char s[] = { 'a', '\0' };
char t[] = { 'a', '\0' };
在上面的循环之后len将等于1(前提是你最初用0初始化len)。同时t和s将指向终止零之后的存储器。因此*( s - len )
和*( t - len )
将代表元素'\0'
,您将仅比较这些终止零,而不会比较具有'a'的元素,因为for循环的条件为{{1 }}。这意味着当len等于1时,循环只会有一次迭代。
正确的功能可以写得更简单,更清晰
len>0
如果一个字符串出现在另一个字符串的末尾并不重要,那么只需替换此return语句
int strend( const char *s, const char *t )
{
const char *p = s;
const char *q = t;
while ( *s++ );
while ( *t++ );
while ( s != p && t != q && *( s - 1 ) == *( t - 1 ) ) --s, --t;
return t == q;
}
以下
return t == q;
在这种情况下,这个程序
return s == p || t == q;
将输出
//...
int main( void ) {
char one[] = "I 0dont like youa";
char two[] = "ke youa";
printf("%d\n", strend(one, two));
printf("%d\n", strend(two, one));
}
如果要使用,请使用第一个返回语句1
1
,然后使用程序
return t == q;
将输出
//...
int main( void ) {
char one[] = "I 0dont like youa";
char two[] = "ke youa";
printf("%d\n", strend(one, two));
printf("%d\n", strend(two, one));
}
答案 2 :(得分:0)
错误应该是因为缺少初始化int len = 0;
。我建议while
总是使用while { /*your code*/ };
这样的包含。
你的第一个while循环应该没问题。我用两个独立的循环做了一些修改。
#include <stdio.h>
int strend(char *s, char *t)
{
int len = 0; // init 0
int i = 0,
j = 0;
while (*s++) { i++; } // get both string lengths
while (*t++) { j++; }
if (i > j) // compare and use shorter one
len = j;
else
len = i;
len++; // offset: start from 1st character
// [fix-issue: 2015-06-28 12:41]
for ( ; len>0 ; len--)
{
//printf("%d: \"%c\" \"%c\"\n", len, *(s-len), *(t-len)); // test-out
if ( *(s-len) != *(t-len) )
return 0;
}
return 1;
}
int main()
{
char one[] = "ABCDE";
char two[] = "CDE";
printf("test case 1: [%s][%s] %d\n", one, two, strend(one, two));
two[1] = '_';
printf("test case 2: [%s][%s] %d\n", one, two, strend(one, two));
two[0] = '?';
two[1] = 'D';
printf("test case 3: [%s][%s] %d\n", one, two, strend(one, two));
two[0] = 'C';
two[2] = '#';
printf("test case 4: [%s][%s] %d\n", one, two, strend(one, two));
}
输出如下:
test case 1: [ABCDE][CDE] 1
test case 2: [ABCDE][C_E] 0
test case 3: [ABCDE][?DE] 0
test case 4: [ABCDE][CD#] 0