Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
中止陷阱:strncat()出现6个错误_C_Abort - Fatal编程技术网

中止陷阱:strncat()出现6个错误

中止陷阱:strncat()出现6个错误,c,abort,C,Abort,我正在尝试编写代码,其中必须实现库函数strncpy、strncat和strncmp的版本,但它在运行时给了我Abort trap:6 error。非常感谢您的任何想法: #include<stdio.h> #include<string.h> int main() { char str1[400]; printf ("Enter the first string: "); fgets (str1, 400, stdin); ch

我正在尝试编写代码,其中必须实现库函数strncpy、strncat和strncmp的版本,但它在运行时给了我Abort trap:6 error。非常感谢您的任何想法:

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

int main() {

    char str1[400];

    printf ("Enter the first string: ");
    fgets (str1, 400, stdin);

    char str2[400];

    printf ("Enter the second string: ");
    fgets (str2, 400, stdin);

    int num;

    printf ("Enter the number: ");
    scanf ("%d", &num);

    char dest[num];

    strncpy(dest, str2, num);
    dest[num] = '\0';

    printf ("strncpy is %s \n", dest);

    int lengthStr1 = strlen (str1);

    char str1copy [lengthStr1];
    strncpy(str1copy, str1, lengthStr1);
    str1copy [lengthStr1] = '\0';

    printf ("str1copy is %s \n", str1copy);

    strncat(str1copy, dest, num);
    printf ("strncat is %s\n", str1copy);
}
#包括
#包括
int main(){
char-str1[400];
printf(“输入第一个字符串:”);
fgets(str1,400,标准蛋白质);
char-str2[400];
printf(“输入第二个字符串:”);
fgets(str2,400,标准DIN);
int-num;
printf(“输入数字:”);
scanf(“%d”和&num);
char dest[num];
strncpy(dest、str2、num);
dest[num]='\0';
printf(“strncpy是%s\n”,dest);
int length str1=strlen(str1);
字符str1拷贝[长度str1];
strncpy(str1拷贝,str1,长度str1);
str1copy[lengthStr1]='\0';
printf(“str1copy是%s\n”,str1copy);
strncat(str1copy,dest,num);
printf(“strncat是%s\n”,str1copy);
}

我知道我的strncpy部分是有效的。

一个大小为
n
的数组具有
0
n-1
的索引

当您这样声明数组时:

char dest[num];
然后这样做:

dest[num] = '\0';
您正在访问超出数组末尾一个字节的偏移量。这样做会调用,在本例中会在崩溃中表现出来

由于要将
num
字节复制到此数组中,因此大小应再增加1,以便为空字节腾出空间

char dest[num+1];
然后设置
dest[num]
是有意义的

str1copy
也有类似的错误。但是,在这种情况下,使用
长度str1-1
作为偏移量是不够的。从
str1
复制
lengthtstr
字节,然后从
dest
复制一个额外的
num
字节。所以长度必须是这些的总和,加上空终止字节的1

char str1copy [lengthStr1+dest+1];
strncpy(str1copy, str1, lengthStr1);
str1copy [lengthStr1] = '\0';

printf ("str1copy is %s \n", str1copy);

strncat(str1copy, dest, num);
str1copy [lengthStr1+dest] = '\0';
printf ("strncat is %s\n", str1copy);

你能让一个修理工不把你的车送到车库就把它修好吗?您所谓实现的函数在哪里?
dest[num]='\0'超出范围<代码>str1copy[lengthStr1]='\0'同上。也许我不太明白他们所说的实现是什么意思。。我想我们只需要使用函数。您将如何“实现”功能@StoryTeller
return_type func_name(parameters){statements_to_execute;}
是如何“实现”函数的。注意:标准库中定义的名称是保留的。您不能在代码中定义它们,也不能使用其他签名重新声明它们。空值不应该在dest[num]中,但我们将dest[]num的长度设为+1?因为我们要在dest char数组中放入num个字符。@studentNeedHelp如果要复制
num
bytes,那么它需要大1个。另外,您没有为str1copy
留出足够的空间。请参阅我的编辑。