C语言中字符数组与字符数组的赋值
你能帮我写这段代码吗?我可以把arr从索引1复制到arr2,而且,我现在还不能计算索引0,但有些人不能。 你能告诉我这里有什么不对劲吗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;
#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]);
^^^^^^^^^