修改字符串文字

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

#include int main() { char* t="C++"; t[1]='p'; t[2]='p'; printf("%s",t); return 0; } 

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

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

    char arr [] =“C ++”;

    char * t =&arr [0];

也可以修改,

 t[1] = 'p'; t[2] = 'p'; 

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

 char *t = "C++"; // you cannot modify it in most operating systems t[1] = 'p'; t[2] = 'p'; 

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

 const char* t="C++"; 

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

 #include  // You'd better add a space between, for this is a good coding convention #include  // 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 } 

3.关于打印字符串

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

 printf("%s\n",t); 

如果您不希望在字符串后返回回车符。 在Windows中使用你喜欢的:

printf("%s",t);

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

 printf("%s",t); fflush(stdout); 

“C ++”是存储在只读位置的字符串文字,因此无法修改。 有了这个 –

 char* t="C++"; // t is pointing to a string literal stored in read only location 

相反,你应该 –

 char t[] = "C++" ; // Copying the string literal to array t 

实际做 –

 t[1] = 'p' ; 

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

 char* t="C++"; 

这是合法的,但可能存在风险。 包含字符'C', '+', '+', '\0'的数组可以存储在读写存储器中或只读存储器中,可以随意存储在编译器中。

 t[1]='p'; 

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

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

 const char *t = "C++"; 

如果您尝试修改字符串文字,编译器应至少警告您 – 至少如果您尝试通过t执行此操作。

如果你想能够修改它,你应该创建一个可写数组:

 char t[] = "C++"; 

它不是指向指向"C++"开头的指针,而是一个数组, "C++"的内容被复制到该数组中。 你可以用t的内容做你喜欢的事情,只要你不超出它的范围。

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

 #include 

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

 void main() 

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

 printf("%s",t); 

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

 printf("%s\n", t); 

还有这个:

 getch(); 

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

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

 return 0; 

在结束前} 。 这不是真的需要,但这不是一个坏主意。 (C99添加隐式return 0;但Microsoft不支持C99。)

某些版本的标准运行时库需要\n才能显示输出。

 printf("%s\n",t);