C 有没有办法让字符串独立于其他字符串?
这是我代码的一个过程C 有没有办法让字符串独立于其他字符串?,c,string,C,String,这是我代码的一个过程 通过scanf 将字符串存储在数组中arr 重复这项工作 这是我的密码 #包括 内部主(空) { char-str[10]; char*arr[10]; 对于(int i=0;i而言,问题在于赋值 arr[i] = str; 这不会创建str的新副本,而是使arr[i]简单地指向str所指向的位置(这是str数组的第一个元素,或&str[0])。如果对arr的所有元素执行此操作,则所有元素都将指向同一位置 如果你“画”它,它会像这样: +--------+ | arr
- 通过
scanf
- 将字符串存储在数组中
arr
- 重复这项工作
#包括
内部主(空)
{
char-str[10];
char*arr[10];
对于(int i=0;i而言,问题在于赋值
arr[i] = str;
这不会创建str
的新副本,而是使arr[i]
简单地指向str
所指向的位置(这是str
数组的第一个元素,或&str[0]
)。如果对arr
的所有元素执行此操作,则所有元素都将指向同一位置
如果你“画”它,它会像这样:
+--------+
| arr[0] | --\
+--------+ \ +-----+
| arr[1] | ----+--> | str |
+--------+ / +-----+
| arr[2] | --/
+--------+
| arr[3] | --> ???
+--------+
| ...... |
+--------+
现在,arr
的每个元素都是一个独立的数组,您可以在scanf
scanf("%9s", arr[i]);
[请注意格式中添加的长度限制,以免写入超出数组边界]
第二次尝试更糟糕,因为您使用未初始化的指针str
作为scanf
的目标。这意味着scanf
将把它读取的字符串写入不确定的内存位置。这会导致未定义的行为
它仍然存在与第一个程序完全相同的问题,arr
中的每个初始化指针都指向同一个位置
当您在str
中使用字符串文字而不是数组时,您必须记住,在C中,所有字符串文字实际上都是独立的字符数组
这意味着“Hello”
是一个包含六个字符的数组(包括空终止符),“World”
是另一个数组,完全独立于任何其他数组
这意味着arr[0]
将指向“Hello”
数组的第一个字符,arr[1]
和arr[2]
都将指向“World”
数组的第一个字符
arr[1]
和arr[2]
都将指向同一位置,因为在第二次迭代和第三次迭代之间,您没有修改str
。问题在于赋值
arr[i] = str;
这不会创建str
的新副本,而是使arr[i]
简单地指向str
所指向的位置(这是str
数组的第一个元素,或&str[0]
)。如果对arr
的所有元素执行此操作,则所有元素都将指向同一位置
如果你“画”它,它会像这样:
+--------+
| arr[0] | --\
+--------+ \ +-----+
| arr[1] | ----+--> | str |
+--------+ / +-----+
| arr[2] | --/
+--------+
| arr[3] | --> ???
+--------+
| ...... |
+--------+
现在,arr
的每个元素都是一个独立的数组,您可以在scanf
scanf("%9s", arr[i]);
[请注意格式中添加的长度限制,以免写入超出数组边界]
第二次尝试更糟糕,因为您使用未初始化的指针str
作为scanf
的目标。这意味着scanf
将把它读取的字符串写入不确定的内存位置。这会导致未定义的行为
它仍然存在与第一个程序完全相同的问题,arr
中的每个初始化指针都指向同一个位置
当您在str
中使用字符串文字而不是数组时,您必须记住,在C中,所有字符串文字实际上都是独立的字符数组
这意味着“Hello”
是一个包含六个字符的数组(包括空终止符),“World”
是另一个数组,完全独立于任何其他数组
这意味着arr[0]
将指向“Hello”
数组的第一个字符,arr[1]
和arr[2]
都将指向“World”
数组的第一个字符
arr[1]
和arr[2]
都将指向同一位置,因为在第二次迭代和第三次迭代之间,您不修改str
。在C中,赋值仅复制引用,而不复制字符串
您需要复制字符串并为其分配内存
int main(void)
{
char str[10];
char *arr[10];
for(int i=0; i<3; i++) {
scanf("%s", str);
arr[i] = malloc(strlen(str) + 1);
strcpy(arr[i], str);
printf("%s %p\n", arr[i], str);
}
for(int i=0; i<3; i++)
printf("%s\n", arr[i]);
return 0;
}
int main(无效)
{
char-str[10];
char*arr[10];
对于C中的(int i=0;i),赋值仅复制引用,而不复制字符串
您需要复制字符串并为其分配内存
int main(void)
{
char str[10];
char *arr[10];
for(int i=0; i<3; i++) {
scanf("%s", str);
arr[i] = malloc(strlen(str) + 1);
strcpy(arr[i], str);
printf("%s %p\n", arr[i], str);
}
for(int i=0; i<3; i++)
printf("%s\n", arr[i]);
return 0;
}
int main(无效)
{
char-str[10];
char*arr[10];
对于(int i=0;ichar*str;…scanf(“%s”,str);
作为未定义的行为,因为str未初始化且scanf在未定义的地址上写入。您需要深度复制字符串,而不是随时保存同一字符串的地址(即使其内容已修改)例如,使用strdup通过strdup
复制字符串。或者使用malloc
分配动态内存,并直接读取该字符串。char*str;…scanf(“%s”,str);
作为未定义的行为,因为str未初始化,scanf在未定义的地址上写入。您需要深度复制字符串,而不是保存同一字符串的所有时间地址(即使其内容已修改)例如,使用strdup使用strdup
复制字符串,或者使用malloc
分配动态内存并直接读取该字符串。