(原創) 一個關於C語言字串有趣的小題目 (C/C++) (C)

Abstract
這是學弟的家庭作業,一個關於C語言字串有趣的題目。

Introduction
a = 1、b = 2、c = 3...以此類推,若輸入字串abc時,表示1 + 2 + 3 = 6,若輸入字串abcd時,表示1 + 2 + 3 + 4 = 10。


C語言

 1 /* 
 2 (C) OOMusou 2008 http://oomusou.cnblogs.com
 3 
 4 Filename    : cstring_sum.cpp
 5 Compiler    : Visual C++ 8.0
 6 Description : Demo how to use abstract base class simulate interface
 7 Release     : 03/16/2007 1.0
 8 */
 9 #include <stdio.h>
10 
11 void func(char *s) {
12   int sum = 0;
13   
14   while(*s)
15     sum += (*s++ - 96);
16   
17   printf("%d", sum);
18 }
19 
20 int main() {
21   char s[27];
22   scanf("%s", s);
23   func(s);
24 }


執行結果

abc
6

14、15行

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
雖然是一個短短的程式,但可以看出老師們出這個作業的苦心,包含了很多C語言獨特的觀念。在The C Programming Language這本書使用while的機會遠比for多,主要是while若搭配pointer可以使用*s++寫法,在字串又可以用while(*s),這是C語言異於其他語言之處。

See Also
(原創) 如何一個字元一個字元的印出字串? (C)

posted on 2008-04-15 16:48  真 OO无双  阅读(3808)  评论(4编辑  收藏  举报

导航