C语言中字符数组与字符数组的赋值

C语言中字符数组与字符数组的赋值,c,arrays,string,pointers,char,C,Arrays,String,Pointers,Char,你能帮我写这段代码吗?我可以把arr从索引1复制到arr2,而且,我现在还不能计算索引0,但有些人不能。 你能告诉我这里有什么不对劲吗 #include <stdio.h> int main(){ char arr[] = "char_arr_one"; char arr2[] = {arr}; printf("%s\n%s\n", arr, arr2); int i; for(i=0;i<13;

你能帮我写这段代码吗?我可以把arr从索引1复制到arr2,而且,我现在还不能计算索引0,但有些人不能。 你能告诉我这里有什么不对劲吗

#include <stdio.h>

int main(){
        char arr[] = "char_arr_one";
        char arr2[] = {arr};
        printf("%s\n%s\n", arr, arr2);
        int i;
        for(i=0;i<13;i++){
                printf("%c %c\n", arr[i], arr2[i+1]);
        }
}


这是我的系统工作

在C语言中,不能将数组分配给数组

你需要自己复制它

    char arr[] = "char_arr_one";
    char arr2[sizeof(arr)];

    memcpy(arr2, arr, sizeof(arr);


在C语言中,不能将数组分配给数组

你需要自己复制它

    char arr[] = "char_arr_one";
    char arr2[sizeof(arr)];

    memcpy(arr2, arr, sizeof(arr);


C标准不允许将一个数组分配给另一个数组:

char arr[] = "char_arr_one";
char arr2[] = {arr};        // This does not work.
正如您所说的,我不知道为什么它可以在特定的实现上工作,但一般来说,在没有至少一个警告的情况下编译代码是不可能的

那么,也许你禁用或甚至忽略了警告

链接到该上下文的链接如下:

尽管如此,这并不能为您带来将字符串char\u arr\u one复制到arr2中所需的结果

如果要在arr2中存储存储在arr内部的字符串,可以在头字符串中使用strcpy。h:

请注意,您需要指定arr2的元素,这些元素至少需要与定义arr2时存储char_arr_one字符串加上终止空字符\0所需的元素相同。在这种情况下,arr2需要至少有13个char对象

您还可以使用sizeof运算符自动检测arr的大小:

char arr[] = "char_arr_one";
char arr2[sizeof(arr)];       // Automatically detects the size of `arr` and provides
                              // it for specify the required amount of elements for storing 
                              // the string in arr + the null character.

strcpy(arr2,arr);             // Copies the string in arr into arr2.
除此之外,printf调用中arr2[i+1]的第三个参数将使您进入未定义的行为。在最后一次迭代中,它将打印arr2数组之外的内容。因此,将其更改为arr2[i]

修正后的代码应为:

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

int main(){
        char arr[] = "char_arr_one";
        char arr2[sizeof(arr)];

        strcpy(arr2,arr);

        printf("%s\n%s\n",arr,arr2);

        for(int i = 0; i < 13; i++){
                printf("%c %c\n", arr[i], arr2[i]);
        }

        return 0;
}

C标准不允许将一个数组分配给另一个数组:

char arr[] = "char_arr_one";
char arr2[] = {arr};        // This does not work.
正如您所说的,我不知道为什么它可以在特定的实现上工作,但一般来说,在没有至少一个警告的情况下编译代码是不可能的

那么,也许你禁用或甚至忽略了警告

链接到该上下文的链接如下:

尽管如此,这并不能为您带来将字符串char\u arr\u one复制到arr2中所需的结果

如果要在arr2中存储存储在arr内部的字符串,可以在头字符串中使用strcpy。h:

请注意,您需要指定arr2的元素,这些元素至少需要与定义arr2时存储char_arr_one字符串加上终止空字符\0所需的元素相同。在这种情况下,arr2需要至少有13个char对象

您还可以使用sizeof运算符自动检测arr的大小:

char arr[] = "char_arr_one";
char arr2[sizeof(arr)];       // Automatically detects the size of `arr` and provides
                              // it for specify the required amount of elements for storing 
                              // the string in arr + the null character.

strcpy(arr2,arr);             // Copies the string in arr into arr2.
除此之外,printf调用中arr2[i+1]的第三个参数将使您进入未定义的行为。在最后一次迭代中,它将打印arr2数组之外的内容。因此,将其更改为arr2[i]

修正后的代码应为:

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

int main(){
        char arr[] = "char_arr_one";
        char arr2[sizeof(arr)];

        strcpy(arr2,arr);

        printf("%s\n%s\n",arr,arr2);

        for(int i = 0; i < 13; i++){
                printf("%c %c\n", arr[i], arr2[i]);
        }

        return 0;
}
我可以将arr从索引1复制到arr2中,而且,到目前为止,我无法计算索引0,但其他一些人无法

你凭什么对此有把握?我没有看到任何代码将arr从索引1复制到arr2或更进一步

查看语句中的gcc编译器警告,根据您的说法,该语句将arr从索引1复制到arr2:

访问超出其大小的数组是不可能的。一个未定义的行为包括它可能会错误地执行,或者崩溃或者无声地生成错误的结果,或者它可能会意外地完全按照程序员的意图执行

1来自C标准6.2.5p15

15字符、有符号字符和无符号字符这三种类型统称为字符类型。实现应将字符定义为与有符号字符或无符号字符具有相同的范围、表示和行为。45

我可以将arr从索引1复制到arr2中,而且,到目前为止,我无法计算索引0,但其他一些人无法

你凭什么对此有把握?我没有看到任何代码将arr从索引1复制到arr2或更进一步

查看语句中的gcc编译器警告,根据您的说法,该语句将arr从索引1复制到arr2:

访问超出其大小的数组是不可能的。一个未定义的行为包括它可能会错误地执行,或者崩溃或者无声地生成错误的结果,或者它可能会意外地完全按照程序员的意图执行

1来自C标准6.2.5p15

15字符、有符号字符和无符号字符这三种类型统称为字符类型。实现应将字符定义为与有符号字符或无符号字符具有相同的范围、表示和行为。45


这在哪个系统上工作?GCC抱怨:警告:从“char*”初始化“char”会在没有强制转换[-Wint转换]的情况下从指针生成整数,即使没有明确启用警告选项。你应该注意编译器的警告-编译器比你更了解C。数组不是指针,数组不能分配给它。@JonathanLeffler之前我在sololearn上做了同样的操作,现在我在Ubuntu 1上也做了同样的操作

6.01. 就连哈克朗克也给了我同样的答案!这不是合法的C代码。无论你看到什么结果,都完全是偶然发生的。请阅读这个是的:那是因为你忽略了conpiler警告。你不应该这样。曾经永远不要忽略编译器警告。当你这么做的时候,奇怪的事情发生了,你不知道为什么。不要运行带有警告的编译代码。别那么做。就这么简单,它在哪个系统上工作?GCC抱怨:警告:从“char*”初始化“char”会在没有强制转换[-Wint转换]的情况下从指针生成整数,即使没有明确启用警告选项。您应该注意编译器警告-编译器比您更了解C。数组不是指针,数组不能分配给。@JonathanLeffler之前我在sololearn上做了同样的操作,现在我在Ubuntu 16.01上也做了同样的操作。就连哈克朗克也给了我同样的答案!这不是合法的C代码。无论你看到什么结果,都完全是偶然发生的。请阅读这个是的:那是因为你忽略了conpiler警告。你不应该这样。曾经永远不要忽略编译器警告。当你这么做的时候,奇怪的事情发生了,你不知道为什么。不要运行带有警告的编译代码。别那么做。就是这么简单。我把上面的代码复制到hackerrank,它就在那里工作@ArooshRana如果你知道的更多-你为什么问问题?但我可以向你保证。它在那里不起作用。@P__________我在问我找到了什么新东西。这不是我争论的问题。@ArooshRana你在这里没有学到或发现任何新东西。每次打印arr时,通过读取超出边界的arr2访问其元素,arr2的长度为1字节,在arr之前,因为它们存储在堆栈上,较新的元素具有较低的地址。我将上述代码复制到hackerrank,它在那里工作@ArooshRana如果你知道的更多-你为什么问问题?但我可以向你保证。它在那里不起作用。@P__________我在问我找到了什么新东西。这不是我争论的问题。@ArooshRana你在这里没有学到或发现任何新东西。每次打印arr时,通过读取超出边界的arr2来访问其元素。arr2的长度为1字节,它位于arr之前,因为它们存储在堆栈上,较新的元素具有较低的地址。
char_arr_one
char_arr_one
c c
h h
a a
r r
_ _
a a
r r
r r
_ _
o o
n n
e e
<source>:5:24: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]

5 |         char arr2[] = {arr};
    for(i=0;i<13;i++){
            printf("%c %c\n", arr[i], arr2[i+1]);
                                      ^^^^^^^^^