Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
C 有没有办法让字符串独立于其他字符串?_C_String - Fatal编程技术网

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;i
char*str;…scanf(“%s”,str);
作为未定义的行为,因为str未初始化且scanf在未定义的地址上写入。您需要深度复制字符串,而不是随时保存同一字符串的地址(即使其内容已修改)例如,使用strdup通过
strdup
复制字符串。或者使用
malloc
分配动态内存,并直接读取该字符串。
char*str;…scanf(“%s”,str);
作为未定义的行为,因为str未初始化,scanf在未定义的地址上写入。您需要深度复制字符串,而不是保存同一字符串的所有时间地址(即使其内容已修改)例如,使用strdup使用
strdup
复制字符串,或者使用
malloc
分配动态内存并直接读取该字符串。