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

相关文章:

将 C 字节数组转换为 long long

c - opencv保存文件xml

c - Visual Studio "illegal use of this type as an expression"

c - 无符号 long long 不同的结果

c - 使用 void 返回数组的内存地址

c - Pro*C 在 IN 子句中返回 Not a number

c - C 中的单向链表

c - 尝试运行简单的 RPC 程序时出错

c - 识别 PostgreSQL 和 libpq 上的语句

更改常量指针的内存位置