C 中的 strncpy 和 strcat 垃圾字符
strncpy and strcat garbage characters in C
我尝试编写一个程序,它从字符串 s1 复制第 k 个字符,然后将结果与字符串 s2 从位置 i 开始的其余部分连接起来
然后在结果中连接 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]='[=10=]';
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
.
Warning: If there is no null byte among the first n bytes of src, the
string placed in dest will not be null-terminated.
也就是说,如果您的代码中的值 k
小于 strlen(s1)+1
那么 result
中的结果内容将不会以 NUL 终止。一种可能的解决方法是这样更改您的代码:
/* Sanity check. */
if (k > strlen(s1)) {
k = strlen(s1);
}
strncpy(result , s1, k);
result[k] = '[=10=]';
此外,与您的问题没有直接关系,但您的代码中存在内存泄漏。
- 主要是
temp
变量收到一个 malloc
缓冲区,然后立即丢失,因为 temp
被 strninsert
结果覆盖。
strninsert
的结果是未在任何地方释放的动态内存。
正如 kaylum 之前回答的那样,strncpy
的结果不一定是字符串。这在将它传递给 strcat
时会造成危险,因为 strcat
要求两个参数明确地是一个字符串。
我能想到的解决问题的最佳方法是使用 sprintf
,如下所示:
void solution(char *destination, char *x, int x_size, char *y) {
sprintf(destination, "%*.s%s", x_size, x, y);
}
我尝试编写一个程序,它从字符串 s1 复制第 k 个字符,然后将结果与字符串 s2 从位置 i 开始的其余部分连接起来
然后在结果中连接 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]='[=10=]';
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
.
Warning: If there is no null byte among the first n bytes of src, the string placed in dest will not be null-terminated.
也就是说,如果您的代码中的值 k
小于 strlen(s1)+1
那么 result
中的结果内容将不会以 NUL 终止。一种可能的解决方法是这样更改您的代码:
/* Sanity check. */
if (k > strlen(s1)) {
k = strlen(s1);
}
strncpy(result , s1, k);
result[k] = '[=10=]';
此外,与您的问题没有直接关系,但您的代码中存在内存泄漏。
- 主要是
temp
变量收到一个malloc
缓冲区,然后立即丢失,因为temp
被strninsert
结果覆盖。 strninsert
的结果是未在任何地方释放的动态内存。
正如 kaylum 之前回答的那样,strncpy
的结果不一定是字符串。这在将它传递给 strcat
时会造成危险,因为 strcat
要求两个参数明确地是一个字符串。
我能想到的解决问题的最佳方法是使用 sprintf
,如下所示:
void solution(char *destination, char *x, int x_size, char *y) {
sprintf(destination, "%*.s%s", x_size, x, y);
}