编程论坛
注册
登录
编程论坛
→
C语言论坛
为什么不能输出’w‘这个字符???
福建刘德华
发布于 2020-02-19 15:08, 2903 次点击
#include<stdio.h>
void main(void)
{
char * const str = "shiyuanlimei";
printf("\n\n%s",str);
str[0] = 'w';
printf("\n\n%c",*str);
只有本站会员才能查看附件,请
登录
}
10 回复
#2
福建刘德华
2020-02-19 15:09
求助 界面有看不清楚的 可以先回复
不太会弄
见谅
谢谢
#3
cfather
2020-02-19 15:45
首先void main是错的,是int,printf后面的参数应该是str[0],不是str*,str*是一种数据类型,ok?
#4
rjsp
2020-02-19 16:07
修改 字符串字面量(string literals) 是未定义行为。
你的代码可浓缩为一句 "shiyuanlimei"[0] = 'w';
根据C标准,其行为未定义。
#5
叶纤
2020-02-19 16:27
程序代码:
根据楼上的建议改了下你的代码
#include
<stdio.h>
int
main (
int
argc,
char
*argv[])
{
const
char
* str =
"
shiyuanlimwei
"
;
const
char
*s=
"
w
"
;
printf(
"
\n%s
"
,str);
str=s;
printf(
"
\n\n%c
"
,*str);
printf(
"
\n\n%s
"
,str);
//
你的代码可浓缩为一句 "shiyuanlimei"[0] = 'w';
}
[此贴子已经被作者于2020-2-19 17:50编辑过]
#6
rjsp
2020-02-19 16:42
如果你是想用 字符串字面量(string literals)
,那么C标准建议你这么写
程序代码:
#include
<stdio.h>
int
main(
void
)
{
const
char
* str =
"
shiyuanlimei
"
;
str[
0
] =
'
w
'
;
puts( str );
}
此时,会直接编译失败,阻止了可怖的“未定义行为”。
而之所以 char* str = "shiyuanlimei"; 在C语言中合法,只是为了不用去修改古代遗传下来的巨量代码,而不是让你在新社会去做“返祖”的勾当。
说得再明白些,古人之所以写 char* str = "shiyuanlimei" 前面不加 const,是因为C89/C90时C语言中没有const关键字,没法写,只能自己注意不要去粗心修改了它,一旦不小心修改了 字符串字面量(string literals),那么行为结果不可预期。
而如今,若有人 char* str = "shiyuanlimei" 前面依旧不加 const,那是脑子有恙,满清已经灭亡了,还在学老奶奶裹小脚。
若是想修改字符串
,那么就别用
字符串字面量(string literals)
,即
程序代码:
#include
<stdio.h>
int
main(
void
)
{
char
str[] =
"
shiyuanlimei
"
;
puts( str );
str[
0
] =
'
w
'
;
puts( str );
}
此时,编译通过,运行正常。
#7
rjsp
2020-02-19 16:51
再说说 char * const str = "shiyuanlimei";
char* const str = ……;
这个 const 在 str 之前,那么它的作用是修饰 str 为 const,即阻止修改 str 本身;
也就是 str = ……; 将不合法
char const* str = ……; 以及 const char* str = ……;
这个 const 在 *str 之前,那么它的作用是修饰 *str 为 const,即阻止修改 str 指向的内容;
也就是 str[0]=……; str[1]=……; 等等将不合法
以上两个 const 修饰的是两个不同的对象,因此它们互不相干,可以同时存在,例如
char const * const str = ……;
前面的 const 修饰 *str,后面的 const 修饰 str,即 str本身 与 str指向的内容 都是const化的,不可以被修改。
#8
叶纤
2020-02-19 18:23
程序代码:
感谢楼上指正了我一个很大的错误
128150
;
128150
;
128150
;
字符串文字是一个常量
如果初始化成非常量指针,在c99中可能是允许的,但在c++98中弃用,c++11已经被删除,
const
char
*是规范表达
字符串文字不可被修改,尝试修改字符串文字是个很傻也很古董的行为,因为会引起冲突
字符串文字最大长度65535byte s
#include
<stdio.h>
int
main ()
{
char
str[] =
"
shiyuanlimwei
"
;
printf(
"
\n%s
"
,str);
//
str=s;
str[
0
]=
'
w
'
;
printf(
"
\n\n%c
"
,*str);
printf(
"
\n\n%s
"
,str);
}
#9
forever74
2020-02-19 19:20
嗯,这个问题已经说得很充分了。
建议在这儿下个锚,为后来诸生解惑。
#10
forever74
2020-02-19 19:26
企图修改字符串常量的代码,会被负责任的操作系统阻止。
也许这些代码在一些裸奔(如某些单片机上)或准裸奔(如DOS下)的环境下能够“正常”运行,
然而这些环境并不是现代意义下C的典型环境,因此简称 非典型环境。
#11
yu1776151787
2020-02-22 20:32
#include<stdio.h>
int main ()
{
char str[]= "shiyuanlimwei";
const char *s="w";
printf("\n%s",str);
str[0]=*s;
printf("\n\n%s",str);
}
//我给宁改了改,字符串数组好处理点
1