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)

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

  1. (原創) 如何一個字元一個字元的印出字串? (C/C++) (C)

    Abstract 若只能一個位元一個位元的印出字串,你會怎麼印呢? Introduction 我同學要將字串送到硬體,但硬體所提供的API,一次只能送一個字元,在這裡我們模擬這個情境,一個字元一個字元 ...

  2. contains an invalid path : 1包涵無效路徑,2文件名和系統語言衝突或其他問題

    contains an invalid path : 1包涵無效路徑,2文件名和系統語言衝突或其他問題 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变 ...

  3. solr set java opts_關於 Apache Solr 無法啟動的問題

    你好,我的作業環境是  Windows Server 2008 R2 , Apache Tomcat/8.0.15 , Solr 的版本是 4.10.2 我安裝 Solr 的方式如下: ------- ...

  4. vfp和python比较_(原創) 由C/C++看VFP (技術感想) (C++/VFP)

    我覺得C++整個語言其實一直在做兩件事情 1.讓靜態語言的C++盡量提供動態的功能 2.讓C++提供資料處理的功能 動態功能: 1.多型:C++利用inheritance + dynamic bind ...

  5. (原創) 日文與我 (Japanese) (日記)

    Abstract 剛剛翻了一下大一學的一年日文,才發現原來我日文還學過這麼多東西.... Introduction 我對日文的接觸,開始於國一,當時對中森明菜驚為天人,開始聽日本歌,學習50音,然後開 ...

  6. (原創) 如何讓ThinkPad X61在32位元Windows XP『用』到4GB記憶體? (NB) (ThinkPad) (OS) (Windows)...

    Abstract 由於記憶體便宜,不少人購買新NB時,基於一次到位原則,一次將X61的記憶體加到4GB攻頂,雖然X61的硬體抓的到4GB,但卻沒保證軟體的作業系統可以抓到4GB,只要是32位元的Win ...

  7. (原創) 如何讓ThinkPad X61在32位元Windows XP『用』到4GB記憶體? (NB) (ThinkPad) (OS) (Windows)

    原文地址为: (原創) 如何讓ThinkPad X61在32位元Windows XP『用』到4GB記憶體? (NB) (ThinkPad) (OS) (Windows) Abstract 由於記憶體便 ...

  8. 在delphi中嵌入腳本語言--(譯)RemObjects Pascal Script使用說明(1)(譯)

    在delphi中嵌入腳本語言--(譯)RemObjects Pascal Script使用說明(1)(譯) http://blog.csdn.net/truexf/article/details/15 ...

  9. (原創) 如何將編譯結果,統一放在一個目錄下? (SOC) (Quartus II)

    Abstract Quartus II預設會將所有檔案都放在project的根目錄下,導致根目錄檔案過多,管理不便,若能將編譯的結果統一放到其他目錄下,將有助於日後管理. Introduction 使 ...

  10. (原創) 如何使用SignalTap II觀察reg與wire值? (SOC) (Verilog) (Quartus II) (SignalTap II)

    Abstract 撰寫Verilog時,雖然每個module都會先用ModelSim或Quartus II自帶的simulator仿真過,但真的將每個module合併時,一些不可預期的『run-tim ...

最新文章

  1. nutz微信应用开发项目 nuby
  2. SDH/E1/T1/E3/T3/STM/TDM相关名词介绍
  3. svn git 导入本地文件到远程服务器 import
  4. WCF创建到使用到发布
  5. RedisTemplate实现事物问题剖析和解决
  6. java–Servlet基础
  7. linux下java转储线程_Java线程转储prio值与linux上的真实线程优先级不对应?
  8. (09)Vivado IO约束
  9. 三国演义词云的python代码_词云制作没那么难,Python 10 行代码就实现了!
  10. 计算机网络实验【静态路由】
  11. python类库31[命令行解析]
  12. 开源3D游戏引擎Irrlicht简介
  13. 查看mysql数据库密码_如何查看mysql数据库的登录名和密码
  14. 【小月电子】ALTERA FPGA开发板系统学习教程-LESSON9简易测试系统
  15. 宝塔面板怎么实名认证_云服务器安装宝塔面板完整教程
  16. The Things Network LoRaWAN Stack V3 学习笔记 2.5 LoRa节点配置接入
  17. 使用npm下载包,报错 error An unexpected error occurred: “EPERM: operation not permitted
  18. 大气科技类企业织梦整站模板
  19. eai java_关于EAI,ETL与EII
  20. CANoe.DiVa 操作指南 - 时间参数配置

热门文章

  1. ai如何旋转画布_ai怎么让一个图形等比旋转
  2. C语言入门 函数调用 main函数 int main 是什么
  3. java如何实现对word设置只读或者加密
  4. dp hdu5653 xiaoxin and his watermelon candy
  5. 企业微信应用开发(JS-SDK网页式开发)第一集:创建应用以及配置可信域名
  6. abaqus个人总结 各种问题各种debug
  7. ctfshow web入门 SSTI
  8. python笔记更新(网络编程)
  9. 到底要不要继续坚持做硬件
  10. 爬虫练习——爬取2020kpl王者荣耀职业联赛