修改字符串文字

Sad*_*que 9 c

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

#include<stdio.h>

int main()
{
    char* t="C++";
    t[1]='p';
    t[2]='p';
    printf("%s",t);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 13

AC字符串文字创建一个匿名数组char.任何修改该数组的尝试都有未定义的行为.理想情况下,这将通过创建数组来强制执行const,但C并不总是如此const,并且将其添加到字符串文字会破坏现有代码.

char* t="C++";
Run Code Online (Sandbox Code Playgroud)

这是合法的,但可能存在风险.包含字符的数组'C', '+', '+', '\0'可以存储在读写存储器或只读存储器中,也可以存储在编译器的奇思妙想中.

t[1]='p';
Run Code Online (Sandbox Code Playgroud)

这里程序的行为是未定义的,因为您试图修改字符串文字的内容.编译器不需要在编译时或运行时向您发出警告 - 也不需要做任何事情来使其"正常工作".

如果你想让编译器知道该字符串是只读的,最好自己添加const限定符:

const char *t = "C++";
Run Code Online (Sandbox Code Playgroud)

如果您尝试修改字符串文字,编译器应该至少警告您 - 至少如果您尝试通过这样做t.

如果您希望能够修改它,您应该创建t一个可写数组:

char t[] = "C++";
Run Code Online (Sandbox Code Playgroud)

而不是使t指向的开头的指针"C++",这使得t在其中的内容的一个阵列"C++"被复制.你可以用你的内容做你喜欢的事情t,只要你不超出它的范围.

有关您的代码的更多评论:

#include<conio.h>
Run Code Online (Sandbox Code Playgroud)

<conio.h>特定于Windows(和MS-DOS).如果您不需要您的程序在任何其他系统上工作,那很好.如果您希望它是便携式的,请将其删除.

void main()
Run Code Online (Sandbox Code Playgroud)

这是错的; 正确的声明是int main(void)(int main()在C中有问题,但在C++中是正确的.)

printf("%s",t);
Run Code Online (Sandbox Code Playgroud)

您的输出应以换行符结尾; 如果不是,就会发生各种不好的事情.这个:

printf("%s\n", t);
Run Code Online (Sandbox Code Playgroud)

还有这个:

getch();
Run Code Online (Sandbox Code Playgroud)

是特定于Windows的.当程序完成时,可能需要保持输出窗口关闭,这是Windows开发系统的一个不幸的问题.如果你想要一个更标准的方法来做到这一点,}只需从标准输入中读取一个字符,然后让你Enter完成(尽管它没有给你提示).

最后,因为getchar()返回类型的结果main,它实际上应该这样做; 你可以加

return 0;
Run Code Online (Sandbox Code Playgroud)

在结束之前int.这不是真的需要,但这不是一个坏主意.(C99添加了一个隐含的},但Microsoft不支持C99.)


Mah*_*esh 12

"C++"是存储在只读位置的字符串文字,因此无法修改.有了这个 -

char* t="C++"; // t is pointing to a string literal stored in read only location
Run Code Online (Sandbox Code Playgroud)

相反,你应该 -

char t[] = "C++" ;  // Copying the string literal to array t
Run Code Online (Sandbox Code Playgroud)

实际做 -

t[1] = 'p' ;
Run Code Online (Sandbox Code Playgroud)


小智 7

您的代码还有其他几个问题.

  1. 指针通常用于指向已存在的数据,因此您可以像这样使用它

    char arr [] ="C++";

    char*t =&arr [0];

也可以修改,

t[1] = 'p';

t[2] = 'p';
Run Code Online (Sandbox Code Playgroud)

当然有一种使用字符串的特殊方法 - 让指针指向一个字符串常量.就像你使用的方式:

char *t = "C++";   // you cannot modify it in most operating systems
t[1] = 'p';
t[2] = 'p';
Run Code Online (Sandbox Code Playgroud)

有一种更好的使用方式,更便于携带,易于理解:

const char* t="C++"; 
Run Code Online (Sandbox Code Playgroud)

你的代码有很多不符合c标准的地方

#include <stdio.h> // You'd better add a space between, for this is a good coding convention
#include <conio.h> // only supported by vc/vs in windows, you can use getchar() instead

int main()  // main returns int
{
    char* t = "C++";

    t[1] = 'p';
    t[2] = 'p';
    printf("%s\n", t);  // it's a good habit to add a '\n' when printing a string
    getchar();   // getchar() is supported by c standard library 

    return 0; // return 0 here
}
Run Code Online (Sandbox Code Playgroud)

3.关于打印字符串

Linux是行缓冲的(如果你使用的是Windows,请忽略它:P)并且为了在控制台中更容易阅读,你最好在打印字符串的末尾添加一个'\n':

printf("%s\n",t);
Run Code Online (Sandbox Code Playgroud)

如果你不希望在字符串后有回车符.在Windows中使用就像你喜欢:

printf("%s",t);

在Linux中,您应该在stdlib.h中添加fflush().

printf("%s",t);
fflush(stdout);
Run Code Online (Sandbox Code Playgroud)