C中的strncpy和strcat垃圾字符

时间:2015-11-29 22:47:04

标签: c string strcpy strcat strncpy

我试着编写一个程序,它从字符串s1复制第一个k char,然后将结果与从位置i开始的字符串s2的其余部分连接起来 然后在结果中连接s1的其余部分。然而我在strncpy遇到了一些问题。 它在控制台中显示了一些奇怪的字符,如@。

这是我的代码:

char* strninsert(char *s1, char *s2, int k,int i)
{
    int n=strlen(s1)+strlen(s2)+10; // if i put for exemple 1000 it works
    char *result=(char*)malloc(n*sizeof(char));
    result[0]='\0';
    strncpy(result,s1,k);
    strcat(result,(s2+i));
    strcat(result,(s1+k));
    puts(result);
    return(result);
}

int main()
{
    int lens;
    printf("size string 1 ");
    scanf("%d",&lens);
    char *s=(char*)malloc((lens+1)*sizeof(char));
    getchar();
    fgets(s,lens+1,stdin);

    int lenx;
    printf("enter size string 2 ");
    getchar();
    scanf("%d",&lenx);
    char *x=(char*)malloc((lenx+1)*sizeof(char));
    getchar();
    fgets(x,lenx+1,stdin);

    int lentemp=lenx+lens;
    char *temp=(char*)malloc((lentemp+1)*sizeof(char));

    temp=strninsert(s,x,2,3);
    puts(temp);
    return(0);
}

它显示了strncpy指令之后的奇怪字符 poes@<line

2 个答案:

答案 0 :(得分:6)

strncpy man page says

  

警告:如果src的前n个字节中没有空字节,则   放在dest中的字符串不会以空值终止。

也就是说,如果代码中的值k小于strlen(s1)+1,则result中的结果内容将不会终止。一个可能的解决方法是更改​​您的代码:

/* Sanity check. */
if (k > strlen(s1)) {
    k = strlen(s1);
}

strncpy(result , s1, k);
result[k] = '\0';

此外,与您的问题没有直接关系,但您的代码中存在内存泄漏。

  1. 主要是temp变量收到一个malloc缓冲区,然后在temp结果覆盖strninsert后立即丢失。
  2. strninsert的结果是动态内存,不会在任何地方释放。

答案 1 :(得分:0)

正如之前kaylum所回答的那样,strncpy的结果不一定是字符串。将其传递给strcat时会造成危险,因为strcat要求两个参数最终都是字符串。

我能想到的最好的问题解决方案涉及使用sprintf,如下所示:

void solution(char *destination, char *x, int x_size, char *y) {
    sprintf(destination, "%*.s%s", x_size, x, y);
}