【问题标题】:In code blocks, Strcpy does not work when I declare a string using char * string but works when I declare it as char string[ ] [duplicate]在代码块中,当我使用 char * string 声明字符串时,Strcpy 不起作用,但当我将其声明为 char string[ ] [duplicate] 时起作用
【发布时间】:2020-12-14 04:13:19
【问题描述】:
#include <stdio.h>
#include <string.h>
int main()
{
char t1string[] = "test";
printf("First String value is %s\n", t1string);
strcpy(t1string, "lgs");
printf("Modified First String value is %s\n", t1string);

char * t2string = "test";
printf("Second String value is %s\n", t2string);
strcpy(t2string, "lgs");
printf("Modified Second String value is %s\n", t2string);
return 0;
}

查看上面的一对 strcpy 用法,我试图理解为什么在第二个实例中使用的 strcpy 不起作用,或者它是什么特别错误(我的初学者水平的理解或代码块)?或者它只是告诉我我很愚蠢,因为没有简单地做 t2string = "lgs";?

【问题讨论】:

  • char x[] = "abc" 创建一个 4 个字符长的数组(可写),然后将文字字符串复制到数组中(包括字符串终止字符。)char *x = "abc" 生成一个指针并指向它在文字字符串(不可写)处 - 然后您尝试将信息 strcpy 转换为指针指向的不可写字符串。不同之处在于您可以将信息复制到数组中,但不能将信息复制到文字字符串中。
  • 您发布的代码都不是 C++。它完全是 C。如果是 C++,你将使用 std::string 而不是 strcpy 或 printf。
  • 这里有一点解释:onlinegdb.com/HkAqeK43v
  • 对于您提出的问题,标签是 C 还是 C++ 并不重要,因为两者都可以编译您发布的代码。如果您只想以惯用的 C++ 方式做事,您不会使用指针或数组 - 您将使用 std::string 和 std::vector 或 std::array 但这实际上并不能回答您的问题,因为您的问题是不是关于编写惯用 C++ 的最佳实践。但是,为了避免让 cmets 不使用 C++ 特定功能,您可以将标签更改为 C
  • char * t2string = "test"; 这在 C++ 中绝对是非法的,C++ 编译器应该抱怨它。

标签: c++ codeblocks strcpy


【解决方案1】:

每当您在 C 中看到诸如 "test" 之类的字符串文字时,这就是一个 const char[5] 数组,它在大多数情况下都会衰减为 const char *,也就是指向常量字符数组的指针。字母“t”、“e”、“s”、“t”不能更改。它们与程序指令存储在程序的同一区域中。这些也无法更改。

当您声明像char s[] = "test"; 这样的数组时,常量字符“test”被复制到数组s 中,就像您从它们在s 中的新位置调用memcpy(s, "test", 5); 一样,它们可以被修改。

作为向后兼容性支持,C 允许创建指向 const char * 数组的 char * 指针。但是,如果您尝试写入该常量数组,您的程序仍然会崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多