2013-06-04 100 views
0

我试图模仿以K &式给出:R一个示例程序,它看起来像这样:不是appening连接两个字符串(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 */ 
     ; 
} 

我想要做同样的事情,不同的是, ts,我想复制到一个新的字符串。我的尝试如下:

#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)。我找不到错误在哪里。

+0

首先要做的事情。你应该多加一点来适应终止字符(即'\ 0')。 – Mahesh

+1

您在第一个循环中不必要地更改'i'两次(并创建未定义行为以启动)。 – pmg

+0

@pmg:的确,我没有想到这一点。 – michaelmeyer

回答

3

两个问题:

  • outword终止空字符的空间。需要是:

    char outword[strlen(lword) + strlen(rword) + 1]; 
                 /*^^^*/ 
    
  • 这是undefined behaviouri在同一个语句被修改了两次:

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

有了这两个变化的程序产生一个新的连接字符串(http://ideone.com/9QbU0q) 。

+0

感谢您的精确。我认为这个额外位的空间分配是自动的。似乎我需要阅读更多这本书:) – michaelmeyer

3

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

0

lstr复制到outstr时,您将增加索引两次。使用outstr[i] = lstr[i++]

+0

没有序列点,使它不只是太多的增量,但也未定义的行为。 –

+1

-1 **未定义的行为!**对单独的语句中的复制和增量更好。 – pmg

+0

Oy,我没有注意到,当我为这个答案+1并且现在我无法撤消它时,建议的替换具有相同的问题。我今天可以搞出多少东西...... –