[转贴] 一个关于C语言字串有趣的小题目

a = 1、b = 2、c = 3...以此类推,若输入字串abc时,表示1 + 2 + 3 = 6,若输入字串abcd时,表示1 + 2 + 3 + 4 = 10。

 1  #include <stdio.h>
2
3 void func(char *s) {
4 int sum = 0;
5
6 while(*s)
7 sum += (*s++ - 96);
8
9 printf("%d", sum);
10 }
11
12 int main() {
13 char s[27];
14 scanf("%s", s);
15 func(s);
16 }

执行結果

abc
6

 

6、7行

while(*s)
    sum 
+= (*s++ - 96);


由于C语言字串以'\0'为結尾的特性,所以我们大胆地使用while(*s != '\0'),又因C语言『非0为true』的特性,所以可省略成while(*s),若你习惯其他程式语言,看到这种写法一定很不习惯,但这在C语言这种写法是司空见惯,已经沒有所谓『容不容易阅读的问题』。

a = 1、b = 2、c = 3....是否应该做一个阵列做查表呢?C语言字元有一个很特別的特性:『一个字元也等于其ASCII值』,也就是说 a = 97、b = 98、c = 99,所以我只要將每个字元的ASCII值减去96就变成1、2、3了。

*s++,这也是C语言常见的写法,在The C Program Language这本书到处都是,即:先对s指标取值,取完后指针+1,初学者一定很不习惯这种写法,但这已经是C语言的文化之一。

Conclusion
在The C Programming Language这本书使用while的机会远比for多,主要是while若搭配pointer可以使用*s++写法,在字串又可以用while(*s),这是C语言与其他语言不同之处。 

posted @ 2010-08-26 15:21  xxfighting  阅读(290)  评论(0编辑  收藏  举报