| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2500 人关注过本帖, 1 人收藏
标题:为什么不能输出’w‘这个字符???
只看楼主 加入收藏
福建刘德华
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2020-2-13
结帖率:50%
收藏(1)
已结贴  问题点数:15 回复次数:10 
为什么不能输出’w‘这个字符???
#include<stdio.h>

void main(void)
{
    char * const str = "shiyuanlimei";
   
    printf("\n\n%s",str);
    str[0] = 'w';
    printf("\n\n%c",*str);   
图片附件: 游客没有浏览图片的权限,请 登录注册

}
搜索更多相关主题的帖子: str void 字符 输出 printf 
2020-02-19 15:08
福建刘德华
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2020-2-13
收藏
得分:0 
求助  界面有看不清楚的 可以先回复
不太会弄
见谅
谢谢
2020-02-19 15:09
cfather
Rank: 2
等 级:论坛游民
帖 子:6
专家分:12
注 册:2020-2-12
收藏
得分:3 
首先void main是错的,是int,printf后面的参数应该是str[0],不是str*,str*是一种数据类型,ok?
2020-02-19 15:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:3 
修改 字符串字面量(string literals) 是未定义行为。

你的代码可浓缩为一句 "shiyuanlimei"[0] = 'w';
根据C标准,其行为未定义。

2020-02-19 16:07
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:3 
程序代码:
根据楼上的建议改了下你的代码

#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编辑过]


把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-02-19 16:27
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
如果你是想用 字符串字面量(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 );
}
此时,编译通过,运行正常。
2020-02-19 16:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
再说说 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化的,不可以被修改。

2020-02-19 16:51
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
程序代码:

感谢楼上指正了我一个很大的错误&#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); 
     
}


把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-02-19 18:23
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1696
专家分:4295
注 册:2007-12-27
收藏
得分:3 
嗯,这个问题已经说得很充分了。
建议在这儿下个锚,为后来诸生解惑。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-02-19 19:20
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1696
专家分:4295
注 册:2007-12-27
收藏
得分:0 
企图修改字符串常量的代码,会被负责任的操作系统阻止。
也许这些代码在一些裸奔(如某些单片机上)或准裸奔(如DOS下)的环境下能够“正常”运行,
然而这些环境并不是现代意义下C的典型环境,因此简称 非典型环境。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-02-19 19:26
快速回复:为什么不能输出’w‘这个字符???
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029371 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved