C问题(奇怪)

WIND_ 2008-07-01 06:48:33



int lower(char *strOdata)
{
int Loop = 0;

if (strOdata == NULL) {
return 1;
}

if (strOdata[0] == '') {
return 1;
}

while( strOdata[Loop] != '' ) {
if( isupper(strOdata[Loop]) != 0 ) {
*(strOdata+Loop) = strOdata[Loop] + 32;
}
Loop++;
}

return 0;
}

*(strOdata+Loop) = strOdata[Loop] + 32;这句会报错。。。。。。为什么呢?很正常的修改指针所指向的空间的值啊。。。。?
...全文
312 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
长安宁 2008-07-02
  • 打赏
  • 举报
回复
while( strOdata[Loop] != '' ) 估计是出在了这一句上面,如果遇到 '\0',也是认为,可以继续的;
建议改为 while(!strOdata[loop])
长安宁 2008-07-02
  • 打赏
  • 举报
回复
while( strOdata[Loop] != '' ) 估计是出在了这一句上面,如果遇到 '\0',也是认为,可以继续的;
建议改为 while(strOdata[loop])
bysdy 2008-07-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 WIND_ 的回复:]
其实我算是写错了,编译的时候不会出错,调用运行的时候会出错。。。。。


[perf@localhost wangy]$ cat lower.c
#include <stdio.h>
#include <ctype.h>
/*
*概要:大(文)字の字母を転換する
*パラメータ:
*strOdata 転換用の文字列
*戻る値: 0:転換成功;1:パラメタチェックエラー
*/
int lower(char *strOdata)
{
int Loop = 0;

/* 入力データチェック */
if (strOda…
[/Quote]

日文诶~~~楼主很强大哈,崇拜下~~~我也会就好了,看漫画就方便了~~
WIND_ 2008-07-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hai040 的回复:]
char *aaa="fjkdsjAAFHFJFEIabh";
aaa的数据不能修改,改成char aaa[] = "..."
[/Quote]

谢谢hai040

是这样的,改成数组就可以了,可是这是为什么呢?

是不是因为 char *aaa="fjkdsjAAFHFJFEIabh"; 这样定义的时候aaa所指向的是一个字符串常量,字符串常量是不能修改的?

还是另外有别的原因的????感觉以前我也是这样用,但是没有出现什么不一样,是不是因为我以前用的时候没有修改过它,就不知道了。。。。。。。
  • 打赏
  • 举报
回复
看看loop下标是不是越界了……
e_sharp 2008-07-02
  • 打赏
  • 举报
回复
c字符串是以'\0'是结尾的,而不是''。

na_he 2008-07-02
  • 打赏
  • 举报
回复
Oh,明白了。学习,呵呵
gygl_4 2008-07-02
  • 打赏
  • 举报
回复
这个程序完成的功能就是将字符串中的字母完全转换成小写字母

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>

int lower(char *strOdata)
{
int Loop = 0;

if (strOdata == NULL) {
return 1;
}

if (strOdata[0] == '\0') { //只有这里原先的‘’有warning,程序本身并没有问题
return 1;
}

while( strOdata[Loop] != '\0' ) {
if( isupper(strOdata[Loop]) != 0 ) {
*(strOdata+Loop) = strOdata[Loop] + 32;
}
Loop++;
}

return 0;
}

int main()
{
char haha[] = "hello world!";

lower(haha);

printf("%s\n",haha);

system("pause");
return 0;
}



显示的是"hello world!",ok!


那个指针肯定是没问题了,在检查检查其它的。。。。应该不至于是编译器不支持?
hai040 2008-07-02
  • 打赏
  • 举报
回复
char *aaa="fjkdsjAAFHFJFEIabh";
aaa的数据不能修改,改成char aaa[] = "..."
hai040 2008-07-02
  • 打赏
  • 举报
回复
'\\0'?
WIND_ 2008-07-02
  • 打赏
  • 举报
回复
\\0是空字节,前面我看没发出来,以为是和C语言输出一样要写2个\才能发出来呢。。。。。
WIND_ 2008-07-02
  • 打赏
  • 举报
回复
其实我算是写错了,编译的时候不会出错,调用运行的时候会出错。。。。。


[perf@localhost wangy]$ cat lower.c
#include<stdio.h>
#include<ctype.h>
/*
*概要:大(文)字の字母を転換する
*パラメータ:
*strOdata 転換用の文字列
*戻る値: 0:転換成功;1:パラメタチェックエラー
*/
int lower(char *strOdata)
{
int Loop = 0;

/* 入力データチェック */
if (strOdata == NULL) {
return 1;
}

if (strOdata[0] == '\\0') {
return 1;
}

while( strOdata[Loop] != '\\0' ) {
if( isupper(strOdata[Loop]) != 0 ) {
*(strOdata+Loop) = strOdata[Loop] + 32;
}
Loop++;
}

return 0;
}


int main(void)
{
char *aaa="fjkdsjAAFHFJFEIabh";
int iRet;
printf("aaa=%s\n",aaa);
iRet = lower(aaa);
printf("iRet=%d\n",iRet);
printf("lower(aaa)=%s\n",aaa);
}
[perf@localhost wangy]$ gcc -o lower lower.c
[perf@localhost wangy]$ ./lower
aaa=fjkdsjAAFHFJFEIabh
セグメンテーション違反です
[perf@localhost wangy]$
cataclyam2000 2008-07-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 WIND_ 的回复:]
引用 8 楼 hai040 的回复:
char *aaa="fjkdsjAAFHFJFEIabh";
aaa的数据不能修改,改成char aaa[] = "..."


谢谢hai040

是这样的,改成数组就可以了,可是这是为什么呢?

是不是因为 char *aaa="fjkdsjAAFHFJFEIabh"; 这样定义的时候aaa所指向的是一个字符串常量,字符串常量是不能修改的?

还是另外有别的原因的????感觉以前我也是这样用,但是没有出现什么不一样,是不是因为我以前用的时候没有修改过…
[/Quote]
char *a = "aaaa";
a指向的是const的字符串。
还有就是char a[10]=“aaa”定义的数组可以用char *(a+b)的指针来使用;
但用char *a = "aaaa"定义的不可用a[b]的形式来用;
snowflame 2008-07-02
  • 打赏
  • 举报
回复
因为Char*在初始化时指向了未知的地址,而定义为数组,则在内存中实际开辟了一个空间可以操作,所以直接对一个指针进行操作,可能导致系统的崩溃。
fallening 2008-07-01
  • 打赏
  • 举报
回复
$ cat loop.c
#include <ctype.h>  //for isupper

int lower(char *strOdata)
{
int Loop = 0;

#ifndef NULL
#define NULL 0
#endif //NULL

if (strOdata == NULL) {
return 1;
}

if (strOdata[0] == ' ') {
return 1;
}

while( strOdata[Loop] != ' ' ) {
if( isupper(strOdata[Loop]) != 0 ) {
*(strOdata+Loop) = strOdata[Loop] + 32;
}
Loop++;
}

return 0;
}


$ gcc -c loop.c -Wall
FindFullMoon 2008-07-01
  • 打赏
  • 举报
回复
这句会报错。。。。。。为什么呢?很正常的修改指针所指向的空间的值啊。。。。?

我没看明白。
你这个代码没有上下文。不知道你用的是什么编译器。

#include <stdio.h>
#include <ctype.h>
int lower(char *strOdata)
{
int Loop = 0;

if (strOdata == NULL) {
return 1;
}

if (strOdata[0] == '') {
return 1;
}

while( strOdata[Loop] != '' ) {
if( isupper(strOdata[Loop]) != 0 ) {
*(strOdata+Loop) = strOdata[Loop] + 32;
}
Loop++;
}

return 0;
}

int main()
{
return 0;
}

我用GCC编译了一下下 只提示
有两处empty character constant
strOdata[0] == ''

strOdata[Loop] != ''
把这两处的字符常量改了一下下
再编译即通过 没有提示你说的地方有错误。
HelloDan 2008-07-01
  • 打赏
  • 举报
回复
为什么不把错误的信息贴出来?
xkyx_cn 2008-07-01
  • 打赏
  • 举报
回复
编译报错,运行报错?

我写类似的代码编译不会出错
第一篇 圆梦开篇 迈入程序设计的殿堂 怎样成为一名优秀的程序设计员 程序设计语言发展简史 选择您喜爱的程序设计语言 第二篇 语言基础篇 语法基本概念 C语言的数据输入与输出 C语言程序结构设计 结构化程序设计技巧 第三篇 算法模型篇 实例一 百钱百鸡问题 实例二 分油趣题 实例三 婚礼上的诺言 实例四 黑与白 实例五 歌德巴赫猜想 实例六 回文素数 实例七 中将彩球 实例八 魔术师的秘密 实例九 幸运的基督徒 实例十 汉诺诺 第四篇 数据结构篇 实例一 电子通讯录 实例二 电子通讯的排序 实例三 电话留言箱 实例四 后缀式四则计算器 第五篇 图形音乐篇 计算机作图概述 BGI图形函数作图 实例一 美丽的宝石图案 实例二 用系统定义的线型 实例三 绘制心形图案 实例四 填充图形的使用 实例五 图形方式下的文本输出 实例六 各种实用图表的制作 高级图形设计 实例七 奇怪的人脸 实例八 漫步在Mandelbrot集 实例九 海湾地貌图 实例十 歌曲《雪绒花》 实例十一 自动识谱程序 实例十二 后台演奏程序 第六篇 动画游戏篇 实例一 玩具脚踏车 实例二 星际遨游 实例三 小精灵游戏 实例四 智力九宫格 第七篇 加密解密篇 实例一 数据库文件加密 实例二 还原加密的Fox文件 实例三 伪随机数加解密 实例四 口令加密法 实例五 激光加密法 第八篇 程序界面篇 实例一 小日历 实例二 下拉式菜单 实例三 汉字库的生成与显示 附录一 math.inc 附录二 graphic.inc 附录三 reander.inc

69,364

社区成员

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

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