实施' strend'

时间:2015-06-28 08:22:38

标签: c while-loop

当我运行我为#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));
}

3 个答案:

答案 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