为什么我运行这个程序时没有输出。
#include<stdio.h>
int main()
{
char* t="C++";
t[1]='p';
t[2]='p';
printf("%s",t);
return 0;
}
最佳答案
C 字符串文字创建一个匿名数组 char
。任何修改该数组的尝试都具有未定义的行为。理想情况下,这可以通过创建数组 const
来强制执行。 ,但 C 并不总是有 const
,并将其添加到字符串文字中会破坏现有代码。
char* t="C++";
这是合法的,但存在潜在风险。包含字符 'C', '+', '+', '\0'
的数组可以根据编译器的意愿存储在读写存储器或只读存储器中。
t[1]='p';
这里你的程序的行为是未定义的,因为你试图修改字符串文字的内容。编译器不需要在编译时或运行时警告您这一点,也不需要执行任何操作来使其“工作”。
如果想让编译器知道该字符串是只读的,最好添加 const
自己进行预选:
const char *t = "C++";
如果您尝试修改字符串文字,编译器至少应该警告您 - 至少如果您尝试通过 t
这样做的话.
如果你想能够修改它,你应该制作 t
可写数组:
char t[] = "C++";
而不是制作t
指向 "C++"
开头的指针,这使得t
一个数组,其中包含 "C++"
的内容被复制。您可以根据 t
的内容做您想做的事,只要你不超出它的范围。
对您的代码的更多评论:
#include<conio.h>
<conio.h>
特定于 Windows(和 MS-DOS)。如果您不需要您的程序在任何其他系统上运行,那也没关系。如果您希望它便于携带,请将其删除。
void main()
这是错误的;正确的声明是int main(void)
( int main()
在 C 中是有问题的,但在 C++ 中是正确的。)
printf("%s",t);
你的输出应该以换行符结束;如果不这样做,就会发生各种不好的事情。做这个:
printf("%s\n", t);
(问题最初在结束之前包含此行 }
:
getch();
OP后来删除了它。这是 Windows 特定的。当程序完成时,可能需要防止输出窗口关闭,这是 Windows 开发系统的一个不幸问题。如果您想要更标准的方法来执行此操作,getchar()
只是从标准输入中读取一个字符,然后让您按 Enter 完成(尽管它不会给您提示)。或者,如果您从 IDE 或命令提示符运行程序,大多数都不会立即关闭窗口。)
最后,因为 main
返回 int
类型的结果,实际上应该这样做;您可以添加
return 0;
收盘前}
。这并不是真正需要的,但这并不是一个坏主意。 (C99 增加了一个隐式的 return 0;
,但是微软不支持 C99。)(2019 年更新:微软对 C99 功能的支持稍微好一些,不确定 return 0;
是否有必要。)
关于c - 修改字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48972975/