在C中将char数组分配给char数组

时间:2020-02-29 14:10:29

标签: c arrays string pointers char

您能用这段代码帮我吗,我能够将arr复制到arr2(从索引1开始,而且到目前为止,我还无法找到索引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]);
        }
}

这正在我的系统上工作!

3 个答案:

答案 0 :(得分:2)

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

char arr[] = "char_arr_one";
char arr2[] = {arr};        // This does not work.

我不知道为什么它会在您所说明的特定实现上起作用,但是通常应该在没有至少一个警告的情况下编译该代码。

那么也许您禁用了甚至忽略了警告?

到该上下文的一个链接,在这里: Why should I always enable compiler warnings?

尽管如此,将字符串"char_arr_one"复制到arr2并不会带来期望的结果。

如果您想将存储在arr内的字符串存储在arr2中,则可以在标题strcpy中使用string.h

char arr[] = "char_arr_one";
char arr2[13];                // You need to provide the amount of elements, at least
                              // as much as are required to store the string inside arr
                              // the null character.
strcpy(arr2,arr);             // Copies the string in arr into arr2.

请注意,您需要指定arr2的元素,这些元素至少应与存储"char_arr_one"的字符串以及结尾的空字符\0所需的元素一样多,当定义arr2时。在这种情况下,arr2必须至少具有13个char对象。

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

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.

此外,在arr2[i+1]调用中,printf的第三个参数将使您进入未定义行为。在最后一次迭代中,它将打印超出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;
}

输出:

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

答案 1 :(得分:1)

在C语言中,您无法将数组分配给数组。

您需要自己复制

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

    memcpy(arr2, arr, sizeof(arr);

        for(size_t index = 0; index < sizeof(arr); index++)
        {
            arr2[index] = arr[index];
        }

如果我使您的示例更为简单(通过添加另一个变量),结果将显而易见。它不起作用。

#include <stdio.h>

int main(){
        char arr[] = "char_arr_one";
        char another[] = "it does not work for sure";
        char arr2[] = {arr};
        printf("%p %p\n", (void *)arr, (void *)arr2);
        printf("%s\n%s\n", arr, arr2);
        int i;
        for(i=0;i<13;i++){
                printf("0x%02hhx - '%c' 0x%02hhx, '%c'\n", arr[i], arr[i],
                  arr2[i], (arr2[i] >= 32 && arr2[i] <= 127) ? arr2[i] : ' ' );
        }
}

https://godbolt.org/z/dvLcqq

结果是:

0x7fff4a68b84f 0x7fff4a68b82f
char_arr_one
Oit does not work for sure
0x63 - 'c' 0x4f, 'O'
0x68 - 'h' 0x69, 'i'
0x61 - 'a' 0x74, 't'
0x72 - 'r' 0x20, ' '
0x5f - '_' 0x64, 'd'
0x61 - 'a' 0x6f, 'o'
0x72 - 'r' 0x65, 'e'
0x72 - 'r' 0x73, 's'
0x5f - '_' 0x20, ' '
0x6f - 'o' 0x6e, 'n'
0x6e - 'n' 0x6f, 'o'
0x65 - 'e' 0x74, 't'
0x20 - '' 0x20, ' '

答案 2 :(得分:1)

我能够将arr复制到arr2中(从索引1开始,而且到目前为止,我还无法找到索引0),但是其他一些则不能。 .....

您对此有何把握?我看不到任何将arr从索引复制到arr2从索引 1到进一步的代码。

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

<source>:5:24: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]

5 |         char arr2[] = {arr};

此警告的含义-
数组名称arr衰减为指针,并且指针转换为整数并分配给arr2的第一个元素(元素在数组arr2的第0 个索引处)。
请注意,如果char已签名,则此赋值的结果将是实现定义的 1)

arrarr2在计算机上堆叠的方式可能会获得预期的输出,但在不同的平台/体系结构上可能会得到不同的结果。请注意,C语言标准没有指定如何将函数局部变量放在堆栈中。这些标准甚至没有提到内存段(堆栈,堆等)。这些事情完全取决于基础平台/体系结构。标准只谈论变量的范围和寿命。

你能告诉我这里有什么问题吗?

由于省略了arr2的尺寸,因此编译器将根据初始化程序的大小对其进行计算。 arr2的初始化程序仅包含1元素。因此,arr2的大小将为1,即arr2是仅包含一个元素的char数组。在这里,您访问的arr2超出了其大小:

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

访问超出其大小的数组是undefined behavior未定义的行为可能会导致执行不正确(崩溃或无提示地生成不正确的结果),或者可能偶然地执行了程序员想要的操作。


1)来自C标准#6.2.5p15

15 The three types char, signed char, and unsigned char are collectively called the character types. The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char.45)