在写代码的时候,发现了一个改变字符串常量的问题。网上查了资料,明白了。
来源:
请运行以下代码(仅在TC2.0中)。 不要先看结果,想想你会得到什么:
#
#
整数
主要(int argn, char* argv[])
char* = "你好,世界!";
char* = "你好,世界!";
* = '-';
投入();
0;
输出是:“-ello,world!”;。 结果和你想象的不一样吗?
ANSI C 明确规定:修改字符串常量具有未定义的效果。
首先我们要明白,如何获取字符串常量? 只有一种方法: char* = "Hello, world!"; 该声明获取一个字符串常量。 所以 char[] = "Hello, world!"; 可以吗? 不能! 你得到的是一个字符串变量。 好吧,回过头来,由于 ANSI C 并不要求编译器实现者专门处理字符串常量,所以有些编译器会将多个相同的字符串常量视为一个(注意:这种优化只可能在字符串常量中进行,一般不要将它们用于其他类型的字符串常量)例如:int num1 = 11; int num2 = 11;虽然是两个相同的常量,但修改num1不会影响num2),目的是为了节省内存空间,所以在上面的例子中,当修改字符串a时, b 也被修改。 从这里可以看出,TC2.0对字符串常量进行了优化,但其他编译器(如DEVC++5.0)不一定也优化。 结果可能是编译不通过,也可能编译通过但结果是垃圾。 价值。 由于这些不确定性,我们应该尽量避免修改字符串常量。
如果必须修改字符串又没有办法怎么办? 有! 一定有! 请注意:我们想要的效果是修改字符。 因此,只需要定义字符串变量,而不需要定义字符串常量。 前面提到过,可以定义 char[] = "Hello, world!"; 以数组的形式; 这样就可以在程序中修改字符串了。
尝试以下代码:
#
#
整数
主要(int argn, char* argv[])
char[] = "你好,世界!";
char[] = "你好,世界!";
[0] = '-';
投入();
0;
现在没问题了。
OK,最后请记住:如果需要修改字符串,请使用 char[] = "Hello, world!"; 来声明吧!