(原創) 一個關於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 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)