(原創) 如何一個字元一個字元的印出字串? (C/C++) (C)
Abstract
若只能一個位元一個位元的印出字串,你會怎麼印呢?
Introduction
我同學要將字串送到硬體,但硬體所提供的API,一次只能送一個字元,在這裡我們模擬這個情境,一個字元一個字元的印出字串。
C語言
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 i;
i = 0;
while(s[i] != '\0')
++i;
return i;
}
或者如P.99的
int n;
for(n = 0; *s != '\0'; s++)
n++;
return n;
}
也就是說,為了得到字串長度,已經多跑了一次迴圈,但事實上,這個迴圈是多餘的,若改成以下寫法,就不須多跑這個迴圈。
C語言 / cstring_putchar.c
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)相关推荐
- (原創) 如何將CMOS所擷取的影像傳到PC端? (SOC) (DE2) (TRDB-DC2)
AbstractDE2提供了Control Panel與Image Converter,可以將CMOS所擷取的影像傳到PC端, Introduction 版權聲明:文中所有範例皆出自DE2光碟,版權歸 ...
- (原創) 如何使用C++/CLI读/写jpg檔? (.NET) (C++/CLI) (GDI+) (C/C++) (Image Processing)
Abstract因为Computer Vision的作业,之前都是用C# + GDI+写,但这次的作业要做Grayscale Dilation,想用STL的Generic Algorithm写,但C+ ...
- (原創) 如何讓ThinkPad X61在32位元Windows XP『用』到4GB記憶體? (NB) (ThinkPad) (OS) (Windows)...
Abstract 由於記憶體便宜,不少人購買新NB時,基於一次到位原則,一次將X61的記憶體加到4GB攻頂,雖然X61的硬體抓的到4GB,但卻沒保證軟體的作業系統可以抓到4GB,只要是32位元的Win ...
- (原創) 如何讓ThinkPad X61在32位元Windows XP『用』到4GB記憶體? (NB) (ThinkPad) (OS) (Windows)
原文地址为: (原創) 如何讓ThinkPad X61在32位元Windows XP『用』到4GB記憶體? (NB) (ThinkPad) (OS) (Windows) Abstract 由於記憶體便 ...
- (原創) 如何將編譯結果,統一放在一個目錄下? (SOC) (Quartus II)
Abstract Quartus II預設會將所有檔案都放在project的根目錄下,導致根目錄檔案過多,管理不便,若能將編譯的結果統一放到其他目錄下,將有助於日後管理. Introduction 使 ...
- (原創) Quartus II安裝新觀念:如何將Quartus II安裝在VirtualBox內? (SOC) (Quartus II) (VirtualBox)...
Abstract VM並不是什麼新的觀念,透過VM我們可以在一個OS去執行其他OS,若我們將Quartus II也裝在VM中,將可解決一些長久以來Quartus II使用上所遇到的問題. Introd ...
- (原創) ThinkPad X61安裝過程全紀錄 (NB) (ThinkPad) (X61)
Abstract 我的ThinkPad X61安裝過程詳細紀錄. Introduction Step 1: ThinkPad X61基本硬體 (原創) 如何自行在ThinkPad X61安裝Windo ...
- (原創) 如何正確的使用迴圈(使用for_each)? (C/C++) (STL) (template)
Abstract之前在(原創) 如何使用for_each() algorithm? (C/C++) (STL) 曾經討論過for_each(),不過當時功力尚淺,只談到了皮毛而已,這次看了effect ...
- (原創) Verilog入門書推薦2:數位系統實習 Quartus II (SOC) (Verilog)
Abstract 之前曾經推薦過一本Verilog的薄書,這次再推薦一本適合FPGA與Quartus II的Verilog入門書籍. Intrduction 作者:陸自強 出版社:儒林圖書公司 語言: ...
最新文章
- 公司终于决定放弃微服务传统设计模式,全面拥抱 DDD!
- Codeforces 1023A Single Wildcard Pattern Matching
- 我要做一个什么样的程序员
- Python Django 模型类字段常用属性
- uebs游戏_UEBS Ultimate Epic Battle
- 常用Redis命令总结
- Servlet3.0注解配置访问路径和urlParttern配置
- ERP平台的自动化测试技术实践
- 计算机win7内容已满,Win7旗舰版电脑C盘满了怎么清理
- SecureCRT密钥远程登录Linux
- 美颜相机window 开源_X-Window系统| 免费和开源软件
- dubbo服务压力测试
- OpenGL的几何变换[转]
- 如何在Windows 10宿主机与Windows 98虚拟机之间共享数据
- winform直接控制云台_大疆DJI RSC2相机云台评测:折叠设计带来更多玩法
- 网易你收集用户身份证扫描件意欲何为——隄防维权背后的个人信息安全陷阱
- 经济基础知识(初级)【17】
- 泛型+IO流+网络编程
- Java 源码 - Socket 源码及面试题
- FreeBbs论坛社区APP源码
热门文章
- Harbor未授权创建管理员漏洞(CVE-2019-16097)
- 用java下载apk解析包出错_教大家解析包时出现问题怎么解决
- python 函数基础以及lambda使用
- 海马苹果助手ipad版_不惧掉签 | 苹果IPA安装包,免费自签教程
- python创建ppt_ppt自动化创建工具——python-pptx
- Day505506.图灵学院之面试题① -面经
- 【Docker】No defult Boot2Docer ISO异常
- 电脑使用技巧 快捷键
- tcpdump 文件权限相关问题
- Linux下根据关键字搜索最后一条日志