Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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,无法放大数组C的大小_C_Arrays - Fatal编程技术网

正在编写strncat,无法放大数组C的大小

正在编写strncat,无法放大数组C的大小,c,arrays,C,Arrays,就我而言,strncat放大了要进行cat的数组的大小。 例如: char str1[] = "This is str1"; char str2[] = "This is str2"; 这里str1的长度是12,str2也是12,但是当我strncat它们时,str1从12变为24。 我被要求自己编写strncat,但考虑到我们还没有学习指针,我不知道如何扩大数组的大小 我试着在每次迭代将距离移动1的同时将每个字符放在数组的末尾,但正如您所想,它不会将数据放在数组中,因为在数组str[20]中

就我而言,strncat放大了要进行cat的数组的大小。 例如:

char str1[] = "This is str1";
char str2[] = "This is str2";
这里str1的长度是12,str2也是12,但是当我strncat它们时,str1从12变为24。 我被要求自己编写strncat,但考虑到我们还没有学习指针,我不知道如何扩大数组的大小

我试着在每次迭代将距离移动1的同时将每个字符放在数组的末尾,但正如您所想,它不会将数据放在数组中,因为在数组str[20]中没有这样的位置,例如str的长度为10时

提前感谢,, 非常感谢您的帮助。

strlen返回字符串的长度,即计数到第一个空字符。它不会返回为str1分配的内存大小

将str1连接到str1时,写入的内存超出了为str1分配的内存。这将导致未定义的行为。在你的特殊情况下,似乎什么都没有发生,甚至str1似乎变得更大了。事实并非如此。然而,在您的特殊情况下,如果str2在内存中跟随str1,那么您只是重写了str2。尝试打印str2。它将打印his is str2。

strlen返回字符串的长度,即计数到第一个空字符。它不会返回为str1分配的内存大小


将str1连接到str1时,写入的内存超出了为str1分配的内存。这将导致未定义的行为。在你的特殊情况下,似乎什么都没有发生,甚至str1似乎变得更大了。事实并非如此。然而,在您的特殊情况下,如果str2在内存中跟随str1,那么您只是重写了str2。尝试打印str2。可能会打印出他的是str2。

让学生实现strncat是一项非常奇怪的任务,因为这是一个很难正确使用的C函数

因此,要自己实现它,您应该阅读C标准或POSIX标准中的规范。在那里你会发现strncat没有放大任何数组。顺便说一下,数组在C语言中根本不能被放大,从定义上讲这是不可能的。请注意,单词数组可以包含任意字节,而字符串在标准措辞中必须包含一个空字节


实现strlcat的另一个更明智的选择是strlcat,它不在C标准中,但也广为人知。

让学生实现strncat是一项非常奇怪的任务,因为这是很难正确使用的C函数之一

因此,要自己实现它,您应该阅读C标准或POSIX标准中的规范。在那里你会发现strncat没有放大任何数组。顺便说一下,数组在C语言中根本不能被放大,从定义上讲这是不可能的。请注意,单词数组可以包含任意字节,而字符串在标准措辞中必须包含一个空字节

实现的另一个更明智的选择是strlcat,它不在C标准中,但也广为人知。

因为strcat等人没有放大缓冲区,所以您的实现不必这样做。而且,使用strcat的参数列表是不可能的。调用方负责传递足够大的目标缓冲区

在调用方,您只需创建一个足够大的数组并传递其地址。但是,您仍然可以使用可变长度数组VLA:

char str1[] = "This is str1";
char str2[] = "This is str2";
char str1str2[strlen(str1)+strlen(str2)+1];

strcpy( str1str2, str1 );
yourstrcat( str1str2, str2 );
str1str2足够大,可以存储两个内容加上字符串终止符\0的1。

因为strcat等人没有放大缓冲区,所以您的实现不必这样做。而且,使用strcat的参数列表是不可能的。调用方负责传递足够大的目标缓冲区

在调用方,您只需创建一个足够大的数组并传递其地址。但是,您仍然可以使用可变长度数组VLA:

char str1[] = "This is str1";
char str2[] = "This is str2";
char str1str2[strlen(str1)+strlen(str2)+1];

strcpy( str1str2, str1 );
yourstrcat( str1str2, str2 );

str1str2足够大,可以存储两个内容,再加上字符串终止符\0的1。

谢谢大家,我解决了这个问题。正如你们中的一些人所说,我不需要放大字符串,我只需要确保它足够大,可以包含所有数据。 我最终做的是:

void strnCat(char dest[], char src[], int length)
{
    int i = 0;
    int len = strlen(dest);
    for(i=0; i < length; i++)
    {
        dest[len+i] = src[i];
        dest[len+i+1] = 0;
    }
}

所以我的主要问题是我忘了在数组的末尾添加null使其成为字符串,并且我使用strlenstr而不是将长度保存在变量中。我这样做是因为我忘记了空值消失后字符串没有结尾

谢谢大家,我解决了这个问题。正如你们中的一些人所说,我不需要放大字符串,我只需要确保它足够大,可以包含所有数据。 我最终做的是:

void strnCat(char dest[], char src[], int length)
{
    int i = 0;
    int len = strlen(dest);
    for(i=0; i < length; i++)
    {
        dest[len+i] = src[i];
        dest[len+i+1] = 0;
    }
}
所以我的主要问题是我忘了在数组的末尾添加null使其成为字符串,并且我使用strlenstr而不是将长度保存在变量中。我这么做是因为我忘了世界是没有尽头的

空值消失后的字符串

strncat会放大要搜索的数组的大小。不,它不会。当穿越数组末尾时,可以观察到的效果。这只是运气不好。调用写入的数据超过了str1的末尾,这也可能导致程序崩溃。它并没有变大。您错误地认为它正在变大。strlen返回字符串的长度,即计数到第一个空字符。它不会返回为str1分配的内存大小!我的作业是连接,然后提供足够大的目标缓冲区来连接。注意不要写入超过缓冲区的结尾。strncat会放大要跟踪的数组的大小。不,不会。当穿越数组末尾时,可以观察到的效果。这只是运气不好。调用写入的数据超过了str1的末尾,这也可能导致程序崩溃。它并没有变大。您错误地认为它正在变大。strlen返回字符串的长度,即计数到第一个空字符。它不会返回为str1分配的内存大小!我的作业是连接,然后提供足够大的目标缓冲区来连接。注意不要写入超过缓冲区结尾的内容。@Rolandlllig我们不能使用realloc扩大数组吗?@VenuKantSahu仅当数组最初是allocated@VenuKantSahu不,因为realloc不在阵列上运行,而是在非类型内存上运行。此外,问题清楚地表明他们还没有涵盖指针。是的,这就是我要说的。即使你可以这样做,也不可能返回指针,因为在这种情况下,目标参数必须是char**。@Rolandlllig我们不能仅当数组最初是allocated@VenuKantSahu不,因为realloc不在阵列上运行,而是在非类型内存上运行。此外,问题清楚地表明他们还没有涵盖指针。是的,这就是我要说的。即使你可以这样做,也不可能返回指针,因为在这种情况下,目标参数必须是char**。值得一提的是,VLA仅在C99上可用,在C11上成为可选的。值得一提的是,VLA仅在C99上可用,在C11上成为可选的。所有这些整数实际上都应该是大小。请注意strlen返回的类型。您可以不需要此dest[len+i+1]=0;在循环内部。此外,显示的代码不测试src结尾的终止。这允许读取超过src的末尾,src调用了infamouse未定义的行为。所有这些int实际上应该是size\u ts。注意strlen返回的类型。您不需要此dest[len+i+1]=0;在循环内部。此外,显示的代码不测试src结尾的终止。这允许读取超过src的末尾,src调用未定义的行为。