为什么在我得到名字后字符串满了NULL?

时间:2017-01-15 16:24:11

标签: c string

我是一个初学者,我试图构建一个函数,获取2个字符串的2个指针,并将第二个字符串复制到第一个字符串的末尾(我们可以假设第一个字符串中有足够的位置来包含它们)。 但是这个功能实际上只是放了这个'堆栈'堆栈'在第一个字符串的末尾,并且在它们之间有很多“空”'。我真的不明白为什么。 任何人都可以帮我理解这个问题吗?谢谢

#include <string.h>
#include <stdio.h>

void Strcat(char* t, char* s);

void main()
{
    char str1[14] = "zehavit", str2[] = "stack";
    Strcar(str1, str2);
    printf("%s", str1);
}

void Strcat(char * t, char * s)
{
    int i = 0, counter = 0;
    while ((*t) != '\0')
    {
        counter++;
        t++;
    }

    while ((*s) != '\0')
    {
        t[counter-1+i] = (*s);
        s++;
        i++;
    }

}

4 个答案:

答案 0 :(得分:5)

在我看来,你做了很多多余的事情。 例如,t已经提升,为什么还要添加counter呢? 也许你可以试试这样的东西?

void Strcat(char * t, char * s)
{
    while (*t)
    {
        t++;
    }

    while (*s)
    {
        *t = *s;
        s++;
        t++;
    }

    *t=0;
}

答案 1 :(得分:4)

第一次循环后

t

countert[counter-1+i] = (*s); 都移动了一段字符串,所以

while(*s)
    *t++ = *s++;

*t = '\0'; /* do not forget to NULL terminate that thing */

开始不是从字符串的结尾复制,而是从减1复制两次。 你很有可能想到:

JPG images

答案 2 :(得分:2)

函数中存在两个严重错误

第一个是使用索引

的表达式
t[counter-1+i] = (*s);
  ^^^^^^^^^^^

让我们假设第一个字符串为空。在这种情况下,counter将等于0.

所以在函数的第二个循环中i也等于0时,尝试访问数组之外​​的内存。

while ((*s) != '\0')
{
    t[counter-1+i] = (*s); // if counter and i is equal to 0 then there is t[-1] 
    s++;
    i++;
}

第二个错误是结果字符串未附加终止零。

当函数返回指向结果字符串的指针时,最好也是这样。

因此该功能看起来像

char * Strcat(char *t, const char *s)
{
    char *p = t;

    while ( *p ) ++p;

    do { *p++ = *s; } while ( *s++ );

    return t;
}

这是一个示范程序

#include <stdio.h>

char * Strcat(char *t, const char *s)
{
    char *p = t;

    while ( *p ) ++p;

    do { *p++ = *s; } while ( *s++ );

    return t;
}

int main( void ) 
{
    char t[12] = "Hello ";
    char *s = "World";

    puts( Strcat( t, s ) );
}

考虑到根据C标准函数main,没有参数应声明为

int main( void )

答案 3 :(得分:0)

建议更改此循环:

while ((*s) != '\0')
{
    t[counter-1+i] = (*s);
    s++;
    i++;
}

为:

// append all of second string, except NUL terminator byte
for( i=0; s[i]; i++ )
    t[counter+i] = s[i];

// append NUL terminator byte
t[counter+i] = '\0';