注册 登录
编程论坛 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
cfather2020-02-19 15:45
首先void main是错的,是int,printf后面的参数应该是str[0],不是str*,str*是一种数据类型,ok?
#4
rjsp2020-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
rjsp2020-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
rjsp2020-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
forever742020-02-19 19:20
嗯,这个问题已经说得很充分了。
建议在这儿下个锚,为后来诸生解惑。
#10
forever742020-02-19 19:26
企图修改字符串常量的代码,会被负责任的操作系统阻止。
也许这些代码在一些裸奔(如某些单片机上)或准裸奔(如DOS下)的环境下能够“正常”运行,
然而这些环境并不是现代意义下C的典型环境,因此简称 非典型环境。
#11
yu17761517872020-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