用c中的数组构造我自己的strcat函数

时间:2018-03-09 11:33:07

标签: c arrays string pointers strcat

我正在尝试编写一个像strcat一样工作的函数,编译代码时没有任何错误。问题是在调用函数时它并没有将第二个数组中的元素附加到第一个数组中。当我打印第一个数组时,它仍然是相同的。有什么建议吗?

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

char *strcat1(char *dest, char *src);

char *strcat1(char *dest, char *src) {
    int i;
    int j;
    printf("i0=%d, j0=%d\n", i, j);

    i = strlen(dest);
    j = strlen(src);
    for (int z = 0; z < j; z++) {
        dest[z + i + 1] = src[z];    
    }
}

int main() {
    char str1[100];
    char str2[30];
    printf("put the first string:\n");
    fgets(str1, sizeof(str1), stdin);
    printf("\ninput the second string\n");
    fgets(str2, sizeof(str2), stdin);
    strcat1(str1, str2);
    printf("%s", str1);
}

3 个答案:

答案 0 :(得分:2)

str1由'\ 0'完成。

strlen返回字符串的长度,不包括终止空字符。

例如,如果string是“toto”,那么strlen(string)是4。

在记忆中:

string[0] = 't'
string[1] = 'o'
string[2] = 't'
string[3] = 'o'
string[4] = '\0'

但是你在dest [z + i + 1]写作,所以在我的例子中。 string [z + 4 + 1] whitch是string [5]。 所以在'\ 0'之后。

结果将是:“toto \ 0string2”。

但是因为printf%s停止在\ 0读取指针,所以只能看到“toto”。

尝试替换

dest[z+i+1]

通过

dest[z+i]

答案 1 :(得分:2)

到目前为止,在给定答案中存在一些混淆。 事实上,fgets读取的字符串不仅null character已终止,还包含LINE_FEED字符。

1)复制

dest[z+i+1]=src[z];  

必须按以下方式执行:

dest[z+i-1] = src[z];  

消除&#39; \n' == 0x0A

或将'\n'保留为:

dest[z+i] = src[z]; 

2)我们还必须正确终止连接的字符串 知道ij需要考虑&#39; \ n&#39;字符我们必须相应地终止字符串:

   dest[i+j] = '\0' ;

3)在C90中,原型是:

char *strcat(char *dest, const char *src);

strcat()函数应返回指针dest;该函数没有故障模式,也没有错误返回。

改进的计划:

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

char* strcat1(char* dest, const char* src);

char* strcat1(char* dest, const char* src){
   size_t i;
   size_t j;
   size_t z;

   i = strlen(dest);   //  Note: '\n' is included in the length count
   j = strlen(src);    //  Note: '\n' is included in the length count

   printf("i0=%zu, j0=%zu %X\n ", i, j, src[j-1] );

   for(z=0; z < j; z++){
        dest[z+i] = src[z];    
   }
   dest[i+j] = '\0' ;

  return dest;
}

int main(void){

   char str1[100];
   char str2[30];

   printf("put the first string:\n");
   fgets(str1, sizeof(str1), stdin);

   printf("\ninput the second string\n");
   fgets(str2, sizeof(str2), stdin);

   strcat1(str1,str2);

   printf("\n%s", str1);

   return 0;
}

输出:

put the first string:                                                                                                                           
1234                                                                                                                                            

input the second string                                                                                                                         
567890                                                                                                                                          
i0=5, j0=7 A                                                                                                                                    

1234                                                                                                                                            
567890                                                                                                                                          

答案 2 :(得分:2)

您的strcat1功能存在一些问题:

  • 原型应为char *strcat1(char *dest, const char *src);,因为该函数不会修改源字符串。

  • 应将字符偏移z + i复制到dest数组中。您当前在null终止符后复制源字符串,因此在复制后打印目标数组时不会显示任何内容。

  • 您也必须复制空终止符,以确保正确终止目标数组。

  • 您必须将指针返回目标数组。

  • 索引变量的类型应为size_t,其正范围大于int类型。

以下是修改后的版本:

char *strcat1(char *dest, const char *src) {
    size_t i = strlen(dest);
    size_t j = strlen(src);
    for (size_t z = 0; z <= j; z++) {
        dest[z + i] = src[z];    
    }
    return dest;
}

请注意,您可以使用指针实现此功能,不需要strlen并且只需扫描源字符串:

char *strcat1(char *dest, const char *src) {
    char *p = dest;
    while (*p)
        p++;
    while ((*p++ = *src++) != '\0')
        continue;
    return dest;
}