【问题标题】:Read string constant to non constant variable in C在C中将字符串常量读取为非常量变量
【发布时间】:2016-06-22 15:30:25
【问题描述】:
const char* string_b10_e2 = {"base 10"}; //base 10

有没有办法在非常量字符串变量中读取值“base 10”? 我知道我不能使用 char*,如下所示

char * str,
str =  string_b10_e2; //not allowed

因为它破坏了保持字符串不变的承诺。
但是有没有办法将值读入非常量字符串?

提前致谢。

【问题讨论】:

  • 可以复制字符串。 strcpy
  • const char* string_b10_e2 = {"base 10"};不好
  • char * tempString = (char*) malloc(strlen(string_b10_e2)); strcpy(tempString,string_b10_e2);你不能用这个吗?
  • C 没有字符串类型。 string_b10_e2 不是字符串,而是指针!你想达到什么目标?如果你不能以一种可以理解的方式回答这个问题,请阅读 C 书籍(指针和数组部分和string.h
  • @user3443084:关于如何在 C 中复制字符串已经有很多问题了。为什么他们都没有帮助?

标签: c string constants


【解决方案1】:

在使用常规赋值运算符初始化后,您不能将字符串分配给char * 指针。

但是,您可以使用strcpy 函数。如果你声明它只是一个指针而不是一个固定长度的数组,你还需要为字符串分配内存:

char *str = NULL;
str = malloc(20);
if(str == NULL) return;
strcpy(str, "Hello World!\n")
printf("%s", str);
free(str);
str = NULL;

【讨论】:

  • 不要将 void * 转换为 C 中的指针。如果原始字符串是变量/参数,您的代码将面临巨大的安全风险。
  • @Olaf 安全风险?请解释
  • 如果原始字符串的长度 >19 会怎样?
  • @Olaf 在这种情况下,我们正在复制一个字符串文字,我们肯定知道它的长度小于 19,而不是变量,所以我们知道我们不会遇到这种情况。
  • 这段代码如果碰巧使用了gets,也会带来巨大的安全隐患。幸运的是它没有,所以它不是。稻草人论证不是论证。
【解决方案2】:

有没有办法在非常量字符串中读取值“base 10” 变量?

您可以使用union

union fake {
    const char *as_const;
    char *as_non_const;
};

union fake x;
x.as_const = string_b10_e2;

然后使用x.as_non_const,但要记住不能修改他的内容(它仍然在只读数据段中)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多