C 修改字符串文字
为什么我运行这个程序时没有输出C 修改字符串文字,c,C,为什么我运行这个程序时没有输出 #include<stdio.h> int main() { char* t="C++"; t[1]='p'; t[2]='p'; printf("%s",t); return 0; } #包括 int main() { char*t=“C++”; t[1]='p'; t[2]='p'; printf(“%s”,t); 返回0; } “C++”是存储在只读位置的字符串文本,因此无法修改。用这个- char*
#include<stdio.h>
int main()
{
char* t="C++";
t[1]='p';
t[2]='p';
printf("%s",t);
return 0;
}
#包括
int main()
{
char*t=“C++”;
t[1]='p';
t[2]='p';
printf(“%s”,t);
返回0;
}
“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' ;
标准运行时库的某些版本需要
\n
来显示输出
printf("%s\n",t);
您的代码还有其他几个问题
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++";
2.你的代码有很多地方不是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
}
如果您不希望在字符串之后返回回车符。在windows中,请随意使用:
printf(“%s”,t)代码>
在Linux中,应该在stdlib.h中添加一个fflush()
printf("%s",t);
fflush(stdout);
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>
这是错误的;正确的声明是:代码> int main(无效)<代码>(<代码> int main)(代码>在C中是有问题的,但是C++中是正确的)
您的输出应该以换行符结束;如果不这样做,各种坏事都可能发生。这样做:
printf("%s\n", t);
(问题最初包括在结束前的这一行
}
:
getch();
OP后来将其删除。这是Windows特有的。可能有必要在程序完成时阻止输出窗口关闭,这是Windows开发系统的一个不幸问题。如果您希望使用更标准的方法来执行此操作,getchar()
只需从标准输入中读取一个字符,然后按Enter键即可完成(虽然它不会给你提示)。或者,如果你正在从IDE或命令提示符运行程序,大多数都不会立即关闭窗口。)
最后,由于main
返回类型为int
的结果,它实际上应该这样做;您可以添加
return 0;
在结束之前,}
。这不是必需的,但这不是一个坏主意。(C99添加了一个隐式的返回0;
,但Microsoft不支持C99。)(2019年更新:Microsoft对C99功能的支持稍好一些。我不确定返回0;
是否必要。)main
返回int
,而不是void
。如果没有'\n'
,printf()
输出可能不会在下一个语句执行之前显示(流stdout
,默认情况下,是行缓冲的)。请尝试printf(%s\n,t);
或printf(“%s”,t);fflush(stdout);
@pmg:文本输出流是否需要关闭'\n'
是由实现定义的。如果需要关闭,则行为是未定义的,即使使用fflush(stdout)
。只需打印换行符就更容易、更可靠了。(在许多系统中,不需要换行符,但如果它缺少输出,则输出将与下一个shell提示符相邻,这很难看。)我敦促你接受基思的答案,这是一个更好的答案,我已经投了更高的票。我认为这根本不是问题。很明显。我回答了我认为被问到的问题。事实证明,情况并非如此。@Sadique:来自未来7年的问候!缺失的\n
不是问题,但可能是一个I问题:“最后一行是否需要终止新行字符由实现定义。”--7.21.2p2。如果实现需要终止新行,而程序没有提供终止新行,则行为未定义。在Windows和POSIX/Unix/Linux下,它将只打印字符串而不打印新行(如果将shell提示符连接到输出上,这可能会在视觉上造成混乱。)char*t=“C++”;
没有任何问题。字符串文本以静态分配的4个元素数组的形式提供“已经存在的数据”。(指针应该是const
,但它不是绝对必要的。)fflush
是在
中声明的,而不是在
中声明的。在任何情况下,最好打印换行符;如果不想打印,那么无论如何都应该这样做。#include
是完全可移植的,但是添加一个空格确实可以提高可读性。没有必要
printf("%s\n", t);
getch();
return 0;