Abstract
若只能一個位元一個位元的印出字串,你會怎麼印呢?

Introduction
我同學要將字串送到硬體,但硬體所提供的API,一次只能送一個字元,在這裡我們模擬這個情境,一個字元一個字元的印出字串。

C語言

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 void func(char *s) {
 5   int i;
 6     
 7   for(i = 0; i < strlen(s); i++)
 8     putchar(s[i]);
 9 }
10 
11 int main() {
12   char s[] = "Hello";
13   func(s);
14 }

以上的程式絕對可以順利印出Hello沒問題,乍看之下也頗合理,若從其他語言的思考方式來寫C,很容易寫出以上程式碼。

問題出在strlen()。

根據The C Programming Language 2nd P.39,strlen()可能的實做為

int strlen(char s[]) {
  int i;
  i = 0;

while(s[i] != '\0')
    ++i;

return i;
}

或者如P.99的

int strlen(char *s) {
  int n;
  
  for(n = 0; *s != '\0'; s++)
    n++;

return n;
}

也就是說,為了得到字串長度,已經多跑了一次迴圈,但事實上,這個迴圈是多餘的,若改成以下寫法,就不須多跑這個迴圈。

C語言 / cstring_putchar.c

 1 /* 
 2 (C) OOMusou 2008 http://oomusou.cnblogs.com
 3 
 4 Filename    : cstring_putchar.c
 5 Compiler    : Visual C++ 8.0
 6 Description : Demo how to putchar without strlen()
 7 Release     : 04/16/2008 1.0
 8 */
 9 #include <stdio.h>
10 #include <string.h>
11 
12 void func(char *s) {
13   while(*s) 
14     putchar(*s++);
15 }
16 
17 int main() {
18   char s[] = "Hello";
19   func(s);
20 }

C字串有一個非常好用的特性:最後是'\0'結尾,所以只要搭配pointer一直加1,直到最後為'\0'就停止,這樣就不需在呼叫strlen()了。

Conclusion
一個很小的地方,再次發現C語言字串設計機制的巧妙。

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

Reference
K&R, The C Programming Language 2nd, Prentice Hall

(原創) 如何一個字元一個字元的印出字串? (C/C++) (C)相关推荐

  1. (原創) 如何將CMOS所擷取的影像傳到PC端? (SOC) (DE2) (TRDB-DC2)

    AbstractDE2提供了Control Panel與Image Converter,可以將CMOS所擷取的影像傳到PC端, Introduction 版權聲明:文中所有範例皆出自DE2光碟,版權歸 ...

  2. (原創) 如何使用C++/CLI读/写jpg檔? (.NET) (C++/CLI) (GDI+) (C/C++) (Image Processing)

    Abstract因为Computer Vision的作业,之前都是用C# + GDI+写,但这次的作业要做Grayscale Dilation,想用STL的Generic Algorithm写,但C+ ...

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

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

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

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

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

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

  6. (原創) Quartus II安裝新觀念:如何將Quartus II安裝在VirtualBox內? (SOC) (Quartus II) (VirtualBox)...

    Abstract VM並不是什麼新的觀念,透過VM我們可以在一個OS去執行其他OS,若我們將Quartus II也裝在VM中,將可解決一些長久以來Quartus II使用上所遇到的問題. Introd ...

  7. (原創) ThinkPad X61安裝過程全紀錄 (NB) (ThinkPad) (X61)

    Abstract 我的ThinkPad X61安裝過程詳細紀錄. Introduction Step 1: ThinkPad X61基本硬體 (原創) 如何自行在ThinkPad X61安裝Windo ...

  8. (原創) 如何正確的使用迴圈(使用for_each)? (C/C++) (STL) (template)

    Abstract之前在(原創) 如何使用for_each() algorithm? (C/C++) (STL) 曾經討論過for_each(),不過當時功力尚淺,只談到了皮毛而已,這次看了effect ...

  9. (原創) Verilog入門書推薦2:數位系統實習 Quartus II (SOC) (Verilog)

    Abstract 之前曾經推薦過一本Verilog的薄書,這次再推薦一本適合FPGA與Quartus II的Verilog入門書籍. Intrduction 作者:陸自強 出版社:儒林圖書公司 語言: ...

最新文章

  1. 公司终于决定放弃微服务传统设计模式,全面拥抱 DDD!
  2. Codeforces 1023A Single Wildcard Pattern Matching
  3. 我要做一个什么样的程序员
  4. Python Django 模型类字段常用属性
  5. uebs游戏_UEBS Ultimate Epic Battle
  6. 常用Redis命令总结
  7. Servlet3.0注解配置访问路径和urlParttern配置
  8. ERP平台的自动化测试技术实践
  9. 计算机win7内容已满,Win7旗舰版电脑C盘满了怎么清理
  10. SecureCRT密钥远程登录Linux
  11. 美颜相机window 开源_X-Window系统| 免费和开源软件
  12. dubbo服务压力测试
  13. OpenGL的几何变换[转]
  14. 如何在Windows 10宿主机与Windows 98虚拟机之间共享数据
  15. winform直接控制云台_大疆DJI RSC2相机云台评测:折叠设计带来更多玩法
  16. 网易你收集用户身份证扫描件意欲何为——隄防维权背后的个人信息安全陷阱
  17. 经济基础知识(初级)【17】
  18. 泛型+IO流+网络编程
  19. Java 源码 - Socket 源码及面试题
  20. FreeBbs论坛社区APP源码

热门文章

  1. Harbor未授权创建管理员漏洞(CVE-2019-16097)
  2. 用java下载apk解析包出错_教大家解析包时出现问题怎么解决
  3. python 函数基础以及lambda使用
  4. 海马苹果助手ipad版_不惧掉签 | 苹果IPA安装包,免费自签教程
  5. python创建ppt_ppt自动化创建工具——python-pptx
  6. Day505506.图灵学院之面试题① -面经
  7. 【Docker】No defult Boot2Docer ISO异常
  8. 电脑使用技巧 快捷键
  9. tcpdump 文件权限相关问题
  10. Linux下根据关键字搜索最后一条日志