LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1656|回复: 20

在Linuc C下有没有把整个字符串(仅为字母)转换成小写字母或大写字母的吗?

[复制链接]
发表于 2003-9-28 21:59:41 | 显示全部楼层 |阅读模式
在Linuc C下有没有把整个字符串转换成小写字母或大写字母的吗?
发表于 2003-9-28 22:22:51 | 显示全部楼层
我没见过,其实也简单:

  1. for(i = 0; i < strlen(s); i++)
  2.   s[i] = toupper(s[i]);
复制代码
发表于 2003-9-28 22:54:25 | 显示全部楼层
这样更简单

char *p = s;
while(toupper(*p++));

没有调过
大家可以试试看吧
发表于 2003-9-28 23:00:57 | 显示全部楼层

  1. #include <stdio.h>

  2. char my_toupper(char);

  3. int main()
  4. {
  5.         char s[] = "hello, world!";
  6.         int i;
  7.         for(i = 0; i < strlen(s); i++)
  8.                 s[i] = my_toupper(s[i]);
  9.         printf("%s\n", s);

  10.         return 0;
  11. }

  12. char my_toupper(char c)
  13. {
  14.         if ( c >= 'a' && c <= 'z')
  15.                 return c =  c - 'a' + 'A';
  16.         else
  17.                 return c;
  18. }
复制代码

写了个简陋的 my_toupper() 函数,当然没 toupper() 好了。


  1. char *p = s;
  2. while(toupper(*p++));
复制代码


要改一下。

  1. char *p = s;
  2. while(*p = toupper(*p++));
复制代码

看起来挺危险的。
发表于 2003-9-28 23:50:04 | 显示全部楼层
char *p = s;
while(*p = toupper(*p++));


写了段代码测了一下,run OK.
但是还是不太清楚p++的运算顺序,是不是当执行完*p=toupper(*p)的时候,才发生p++这个动作?是当“++”运算符所在的表达式执行完之后才发生++这个动作吗(当然指++在后,即p++,而非++p的情况)?那么请看如下:

#include <stdio.h>
#include <assert.h>

int main()
{
    int i=3;
    assert(i == i);
    printf("%d %d",i++,i++);
}
在这段程序中,输出结果为"3 4",这种情况应该怎么理解?而如果把assert(i == i),也为assert(i++ == i)或assert(i == i++)或assert (i++ == i++) ,全都会断言失败,能不能给讲一下,实在蒙的很。尤其是assert(i++ == i)竟然断言失败,实在不解。
以上程序测试平台cygwin
发表于 2003-9-29 00:41:45 | 显示全部楼层
这种东西属于“未定义”,其结果不一定是什么,完全取决于编译器的实现,每一种编译器得到的结果都不一样,应该尽量避免。
发表于 2003-9-29 00:55:14 | 显示全部楼层
未定义可以理解,呵呵,原来我记得书上也这么说的,像printf的参数列表的运算顺序,取决于具体编译器的实现,有的从左向右,有的从右向左。问题是assert(i++ = i) ; assert(i == i++) ; assert(i++ == i++) ; 竟然没有一个断言成功,实在费解啊。原来的时候,深的原则也不清楚,++的程序还敢写,现在比原来知道的多点,反而胆子更小了,而且感觉上面那段程序用 *p++ = toupper(*p) 更放心些。
发表于 2003-9-29 11:58:49 | 显示全部楼层
因为assert是一个宏
而不是一个函数

宏可以包含多个语句


后++表示执行完这个句子后再++
想法于
*p = upper(*p);
p++;
\这两个语句的组合
发表于 2003-9-29 13:13:10 | 显示全部楼层
头疼,记得等号运算顺序是从右向左,这里怎么变成从左向右了?

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char str[]="abcdefg";
  5.     char *p=str;

  6.     puts("");
  7.     *p=*p++;
  8.     puts(p);
  9.     puts(str);
  10.     *p++=*p;
  11.     puts(p);
  12.     puts(str);
  13.     *++p=*p;
  14.     puts(p);
  15.     puts(str);
  16.     *p=*++p;
  17.     puts(p);
  18.     puts(str);
  19.    
  20.     puts("");
  21.     strcpy(str,"abcdefg");
  22.     p=str;  
  23.     while(*p=toupper(*p++));
  24.     puts(str);
  25.     p=str;  
  26.     while(*p++=tolower(*p));
  27.     puts(str);
  28.     p=str;  
  29.     while(*p=toupper(*++p));
  30.     puts(str);
  31.     p=str;  
  32.     while(*++p=tolower(*p));
  33.     puts(str);
  34. }
复制代码

输出结果如下:
[root@localhost test]# ./test2

bcdefg
abcdefg
cdefg
abcdefg
defg
abcdefg
efg
abceefg               //  !!!

ABCDEFG
abcdefg
BCDEFG
Bcdefg

***********
修改此帖时加此注:对于上面的问题,搞明白了,“=”的运算顺序是从左向右,不是从右向左,参见“《高质量C++/C编程指南》林锐 博士 2001”第4.1节,运算符的优先级,对于上面“!!!”部分我解释如下:编译器扫描*p=*++p的时候,首先扫描的是“=”左边的*p,此时指向ptr,继续扫描“=”号右边的表达式的时候,发现前++,此时给p进行++,再取*,而且"="左边的已经取值完毕,所以使得两边取值不同,他等同于*(n)=*(n+1)。个人理解,请指点。

关于下面的assert还是不明白,为什么断言失败?哪位能解释一下?谢了。

***********


上面提到的assert,经查assert.h中有如下定义:
  1. extern void __assert (const char *__assertion, const char *__file, int __line)
  2.      __THROW __attribute__ ((__noreturn__));


  3. #  define assert_perror(errnum) \
  4.   (__ASSERT_VOID_CAST (!(errnum) ? 0 :                        \      
  5.                (__assert_perror_fail ((errnum), __FILE__, __LINE__,   \
  6.                           __ASSERT_FUNCTION), 0)))
复制代码

对于test3.c这个程序:
  1. #include <assert.h>
  2. #include <stdio.h>

  3. int main()
  4. {
  5.     int i=3;
  6.     assert(i++ == i);
  7. }
复制代码

执行cpp test3.c后显示如下:
  1. ......
  2. int main()
  3. {
  4.         int i=3;
  5.         ((void) ((i++ == i) ? 0 : (__assert_fail ("i++ == i", "test3.c", 7, ((const char *) 0)), 0)));
  6. }
复制代码

即使是宏替换,也没有理由assert断言失败啊感觉。
真的头疼了......
发表于 2003-9-29 13:52:27 | 显示全部楼层
《高质量C++/C编程指南》林锐 博士 2001   第4.1节,运算符的优先级


  1. 优先级        运算符        结合律
  2. 以下从高到低排列
  3. ( )  [ ]  ->  .                                        从左至右
  4. !  ~  ++  --  (类型) sizeof +  -  *  &                        [b]从右至左[/b]
  5. *  /  %                                                从左至右
  6. +  -                                                从左至右
  7. <<  >>                                                从左至右
  8. <   <=   >  >=                                        从左至右
  9. ==  !=                                                从左至右
  10. &                                                从左至右
  11. ^                                                从左至右
  12. |                                                从左至右
  13. &&                                                从左至右
  14. ||                                                [b]从右至左[/b]
  15. ?:                                                [b]从右至左[/b]
  16. =  +=  -=  *=  /=  %=  &=  ^= |=  <<=  >>=                        从左至右
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表