0

我正在尝试模仿 K&R 中给出的示例程序,如下所示:

void strcat(char s[], char t[])
{
    int i, j;
    i = j = 0;
    while (s[i] != '\0') /* find end of s */
        i++;
    while ((s[i++] = t[j++]) != '\0') /* copy t */
        ;
}

我想做同样的事情,除了我想将两者都复制到一个新字符串中,而不是附加t到。s我的尝试如下:

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

void concat
(const char lstr[], const char rstr[], char outstr[])
{
    int i, j;

    i = j = 0;
    while (lstr[i] != '\0')
        outstr[i++] = lstr[i++];
    while ((outstr[i++] = rstr[j++]) != '\0')
        ;
}

int main(void)
{
    char lword[] = "foo";
    char rword[] = "bar";
    char outword[strlen(lword) + strlen(rword)];

    concat(lword, rword, outword);
    printf("%s\n", outword);
}

但是,上面只打印垃圾(我的意思是f�����bar)。我无法找出错误所在。

4

3 回答 3

3

两个问题:

  • 中没有用于终止空字符的空格outword。需要是:

    char outword[strlen(lword) + strlen(rword) + 1];
                                             /*^^^*/
    
  • 这是未定义的行为,因为i在同一语句中被修改了两次:

    outstr[i++] = lstr[i++];
    
    /* Change to: */
    
    while (lstr[i] != '\0')
    {
        outstr[i] = lstr[i];
        ++i;
    }
    

通过这两个更改,程序会生成一个新的串联字符串 ( http://ideone.com/9QbU0q )。

于 2013-06-04T22:12:18.467 回答
3

C 中的每个字符串都需要以一个不可见的空字符结尾。但是,它确实需要在您分配的内存大小中加以考虑。

于 2013-06-04T22:13:19.477 回答
-1

复制lstroutstr您时,您的索引会增加两次。利用outstr[i] = lstr[i++]

于 2013-06-04T22:14:06.527 回答