字符串指针,编译通过,运行错误,疑惑中!

bfdeh 2008-10-19 03:46:25
#include "stdio.h"
char *my_strupr(char *str);
main()
{
char *a="aAZzff54gFDE";
printf("%s",my_strupr(a));
getch();
}
//字符串大写
char *my_strupr(char *str)
{
char *add=str;
while(*str!='\0')
{
if(*str<123&&*str>96)
*str=*str-32;
str++;
}
return add;
}

程序运行到*str=*str-32;就出错,出错提示为unhandled exception in main.exe: 0xC0000005: Access Violation.
不明白指针操作错在哪里!
...全文
118 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zenny_chen 2008-10-19
  • 打赏
  • 举报
回复
嗯。还是老问题:

将char *a="aAZzff54gFDE";改成char a[]="aAZzff54gFDE";

另外,在函数操作过程中,尽量避免ASCII码,而且又是10进制的,看起来不舒服。
用'a'和'z'就更人性化一点了,呵呵。
而那个32最好也改为'a' - 'A'


char *my_strupr(char *str)
{
char *initPos = str;
char c;
const char delta = 'a' - 'A';

while((c = *str) != '\0')
{
if(c >= 'a' && c <= 'z')
*str = c - delta;
str++;
}
return initPos;
}


PS:根据Intel编程手册,尽量对于不会被改变的常量加以const修饰,避免使用register。我本来很喜欢使用register,不过对于使用Intel编译器或基于Intel PC的开发的话我也会尽量避免使用register。
这样,以上程序更容易被编译器优化了。

leank 2008-10-19
  • 打赏
  • 举报
回复
加深印象了又。
帅得不敢出门 2008-10-19
  • 打赏
  • 举报
回复
char *a="aAZzff54gFDE";
这里的"aAZzff54gFDE"是const char* 在常量区 所以其值不可修改
chenqiang35 2008-10-19
  • 打赏
  • 举报
回复
指针a指向的是一个常量字符串的地址,而常量字符串的地址内容是不能被更改的

//char *a="aAZzff54gFDE";改成
char a[]="aAZzff54gFDE";
zclever 2008-10-19
  • 打赏
  • 举报
回复
char *a="aAZzff54gFDE";//char a[]="aAZzff54gFDE";
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 akirya 的回复:]
常量字符串不能被改写
[/Quote]
up坏
  • 打赏
  • 举报
回复
char *my_strupr(char *str);
int main()
{
char a[]="aAZzff54gFDE";//这里改成数组
printf("%s",my_strupr(a));
getch();
}
//字符串大写
char *my_strupr(char *str)
{
char *add=str;
while (*str!='\0')
{
if (*str<123&&*str>96)
*str=*str-32;
str++;
}
return add;
}
  • 打赏
  • 举报
回复
常量字符串不能被改写

70,025

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧