c - 修改字符串文字

标签 c

为什么我运行这个程序时没有输出。

#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/

相关文章:

c++ - wxWidgets 有某种垃圾收集器吗?

c - 如何在open mp的for循环中解析 "return 0 or return 1"?

c - 在 C 中签名到无符号的转换 - 它总是安全的吗?

c - 如何使用 getch() 在数组中添加一个 2 位数字作为单个条目?

c - 使用 gdb 进入 swapcontext()

c - 为什么我们在嵌入式c程序的末尾使用空while(1)?

c - memcpy 段错误,这段代码有什么问题?

c - 使用 RAW 套接字发送 SYN 后未收到 SYN/ACK

c - 如何在 mingw-w64 gcc 7.1 中无警告地打印 size_t?

c - Windows 中的 C 语言如何进行端口重定向?