【问题标题】:assigning a string to another string将一个字符串分配给另一个字符串
【发布时间】:2012-07-08 07:39:34
【问题描述】:

为什么这段代码没有运行?为什么 str1 没有分配给 str2 ?我知道我可以选择使用 strcpy,但我想知道这不起作用的原因?

#include<stdio.h>
int main()
{
char str1[]="hello";
char str2[10];
str2=str1;
printf("%s",str2);
return 0;
}

而如果我使用指针,它就会像这里一样工作..

#include<stdio.h>
int main()
(
char *s="good morning";
char *q;
q=s;
while(*q!='\0')
{
printf("%c",*q);
q++;
}
return 0;
}

这行得通。 现在字符串已经通过指针复制了,为什么会有这样的差异??

【问题讨论】:

标签: c


【解决方案1】:

str2 是一个静态数组。你不能像指针一样重新分配它。

至于您的指针示例,q=s 重新分配 q 以指向 s 指向的同一空间。但是,指针重新分配不会复制值。

对于静态数组,使用strcpy() 复制值。对于指针,请使用strdup()

【讨论】:

    【解决方案2】:

    你需要做的

    strcpy (str2, str1)

    您需要将str1 的每个元素逐个字符地复制到str2

    您正在做的是尝试将 str1 中的字符串地址分配给数组 var str2,这是不允许的。静态数组不能用于赋值。

    即使你有char *str2;,然后是str2 = str1,虽然你的代码可以工作,但在这种情况下,不会复制字符串,而是将str1中的字符串地址复制到str2,所以现在取消引用str2 将指向字符串

    还请注意,当您将字符串复制到char *str2 时,请始终在复制前分配足够的内存。 一种可能是:

    str2 = malloc (sizeof (char) * (strlen (str1) + 1));
    strcpy (str2, str1);
    

    【讨论】:

    • strlen 的内存太小了一个字节,哎呀
    【解决方案3】:

    str2str1 指的是它们的第一个元素的地址 所以数组的分配不是以这种方式完成的 使用 str[] 按字符分配字符 或者使用内置的strcpy

    【讨论】:

      【解决方案4】:

      您也可以使用 strdup() 来分配存储副本所需的确切空间量。

      【讨论】:

      • 这个功能在 Windows 中可以找到吗?我认为它仅适用于符合 POSIX 的操作系统。我错了吗?
      【解决方案5】:

      在 C 中,您只能分配具有 type 的对象;在 C 中,字符串不是数据类型。相反,它是一种约定——约定是字符串由以空字符结尾的字符数组表示;并且因为数组不被视为类型,字符串也不是。

      在您的第二个代码片段中,您只是让q 指向s;这不是s 处字符串的副本,而仅仅是指针's' 的副本。它们都引用内存中的相同数据。因此,例如,如果您更改了 's' 处的字符串,然后打印了 'q' 处的字符串,您将看到 'q' 处的数据也发生了变化。更直接的是,如果您执行printf( "s:%p, q:%p" (void*)s, (void*)q ) ;,您将看到它们都持有相同的指针值。

      【讨论】:

        猜你喜欢
        • 2019-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多