很多情况下,我们需要知道用户输入的字符串的长度,以便进行下一步工作。

很多读者立即想起了strlen()函数,其实是有问题的,请看下面的代码:

#include

#include

int main(){

char str[21];

int strLen;

printf("Input your string: ");

scanf("%s", str);

strLen = strlen(str);

printf("string = %s\nlength = %d\n", str, strLen);

return 0;

}

运行结果:

Input your string: 1234567890

string = 1234567890

length = 10

----------------------------------

Input your string: 123456 7890

string = 123456

length = 6

----------------------------------

Input your string: 1234567890123456789012345

string = 1234567890123456789012345

length = 25

// 提示程序停止运行

直接通过scanf()读取的字符串,如果超过缓冲区的长度,会提示程序停止运行,而且缓冲区最后一个字节不是NUL,strlen()统计字符串长度可能会出错。

另外,输入的字符串中不能包含空格,因为scanf()读取数据是以空格为分隔的,空格后边的字符串将会赋值给另一个变量。

所以,直接通过scanf()读取字符串并,然后用strlen()统计长度是不行的。

下面的代码,通过getchar()一个一个读取输入的字符来计算长度。

#include

#define MAXLEN 10 // 能够统计的字符串的最大长度

int getStr(char line[], int nmax);

int main(void){

int strLen;

char buffer[MAXLEN+1];

while(1){

printf("Input your string: ");

strLen = getStr(buffer, MAXLEN);

if (strLen==0) // 输入空行,结束程序

break;

printf("string = %s\nlength = %d\n\n", buffer, strLen);

};

}

int getStr(char *buffer, int maxLen){

char c; // 读取到的一个字符

int len = 0; // 当前输入的字符串的长度

// 一次读取一个字符,保存到buffer

// 直到遇到换行符(\n),或者长度超过maxLen时,停止读取

while( (c=getchar()) != '\n' ){

buffer[len++]=c; // 将读取到的字符保存到buffer

if(len>=maxLen){

break;

}

}

buffer[len]='\0'; // 读取结束,在末尾手动添加字符串结束标志

fflush(stdin); // 刷新输入缓冲区

return len;

}

运行结果:

Input your string: 123456

string = 123456

length = 6

Input your string: 1234567890

string = 1234567890

length = 10

Input your string: 123456789012345

string = 1234567890

length = 10

Input your string: www.coderbbs.com

string = www.coderb

length = 10

Input your string:

上面的代码,最多读取 MAXLEN 长度的字符串,并且允许中间出现空格。

长度超过MAXLEN时,截取前MAXLEN个字符,丢掉后边的,不会造成程序错误。

注意:因为字符串最后要多出一个终止符NUL(\0),缓冲区的长度至少要比字符串最大长度大1,这就是buffer的长度为 MAXLEN+1 的原因。

这里重点说明的是getchar()函数。getchar()是有缓冲区的,程序运行到getchar()会暂停,等待用户输入,并将输入的内容保存在输入缓冲区,直到缓冲区满或者按下回车键,才开始读取缓冲区中的内容。读完缓冲区,或者读到第MAXLEN个字符,getStr()函数执行结束,返回读取的长度。

但是,getchar()函数还有一个特性:如果输入缓冲区中有数据,会直接读取,不等待用户输入,只有在没有数据的情况下才等待用户输入。如果用户输入的字符串长度大于MAXLEN,那么getStr()函数第一次执行结束后,不会等待用户输入,会继续读取缓冲区中剩下的内容。所以,每次执行完getStr(),要清空缓冲区的数据,这就是 fflush(stdin) 语句(程序第32行)的作用。

更多关于缓冲区和getchar()的内容请查看:对C语言输入输出流和缓冲区的深入理解

fflush()函数用来刷新缓冲区,其原型为:

int fflush(FILE* stream);

stream为要刷新的缓冲区,stdin表示标准输入缓冲区。

如果没有 fflush(stdin) 语句,输入的字符串过长时,会有下面的现象:

Input your string: 123456

string = 123456

length = 6

Input your string: 12345678901234

string = 1234567890

length = 10

Input your string: string = 1234

length = 4

Input your string: http://www.coderbbs.com

string = http://www

length = 10

Input your string: string = .coderbbs.

length = 10

Input your string: string = com

length = 3

Input your string:

程序会将缓冲区的剩余内容也读取出来,不会丢掉过长的内容。

计算输入字符串的长度c语言,C语言统计输入的字符串的长度相关推荐

  1. c语言 统计数量用count_C语言编程中统计输入的行数以及单词个数的方法

    统计输入的行数 标准库保证输入文本流以行序列的形式出现,每一行均以换行符结束.因此,统计行数等价于统计换行符的个数. #include /* count lines in input */ main( ...

  2. 如何在C语言程序中统计输入汉字的个数

    C中的汉字用"机内码",一个汉字两字节,最高位都是1,所以可以用下列代码求得一个字符串里汉字的个数: #include<stdio.h> #include<str ...

  3. C语言-编写函数统计输入文本中单词的个数,单词之间用空格符、换行符、跳格符隔开,用@作为输入结束标志。

    #include<stdio.h> #define IN 1//标志在一个单词的内部 #define OUT 0//标志在一个单词的外部 int countword();//函数说明语句 ...

  4. C语言-编写程序统计输入的字符中空格符、换行符和横线跳格(制表)符的个数,用!号结束输入。

    #include<stdio.h> #include<ctype.h> main() {long n=0;char ch;while((ch=getchar())!='!')/ ...

  5. C语言怎么实现单词下落,如何用c语言实现单词统计

    如何用c语言实现单词统计 输入一串字符串,输出其中有多少个单词. 代码如下:#include #include #define SIZE 20 int main(){ char str[SIZE]={ ...

  6. [C语言]使用指针将输入的多个字符串按长度升序排序

    [C语言]使用指针将输入的多个字符串按长度升序排序 1.题目 2.完整代码 3.截图 1.题目 编写一个函数,利用指针将输入的多个字符串按长度升序排序 要求:子函数 void StrSort(char ...

  7. C语言:从键盘输入一个长度不定的字符串[C_004]

    目录 背景: Solution: 方案一:那就不要字符串 方案二:动态申请内存 背景: 在很多时候,会遇到从外部按要求输入字符串的情形,有些是明确了长度,有些只是给定了最大长度,而有些没有规定长度.对 ...

  8. c语言编写计算单词长度,编写一个程序,打印输入中单词长度的直方图

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define inside 1 #define outside 0 /*编写一个程序,统计并打印输入单词不同长度的个数,并打印输入中单 ...

  9. java输入一个字符给c赋值_C语言字符串的输入输出

    字符串的输出 在C语言中,输出字符串的函数有两个: puts():直接输出字符串,并且只能输出字符串. printf():通过格式控制符 %s 输出字符串.除了字符串,printf() 还能输出其他类 ...

  10. c语言怎么用scanf输入字母,c语言输入字符串(c语言怎么用scanf输入字符串)

    但是实际操作发现我的字符串无论输入的多长多短,都是输入的什么输出的就. 在C语言中,输入输出字符串有以下两种方式:1 用scanf/printf输入输出.scanf/printf是C语言的格式化输入输 ...

最新文章

  1. iOS 模仿微信的照片选择器
  2. python数据类型详解
  3. numpy中的转置Transpose和.T以及轴对换swapaxis
  4. netty源码分析系列——EventLoop
  5. 百度地图的立体效果来实现
  6. 【机器学习基础】数学推导+纯Python实现机器学习算法4:决策树之ID3算法
  7. 标志寄存器EFLAGES
  8. open函数返回-1_4.6 linux的系统调用执行探究(1)
  9. 苹果cms资源站360影视
  10. Transformer、BERT等模型学习笔记
  11. 对于开发 0 bug 代码的思考——Design by Contract 契约设计
  12. sklearn.preprocessing.StandScaler
  13. 扫描文件怎么设置到服务器,如何为扫描仪添加局域网功能
  14. html中class类怎么写,HTML class 属性 | 菜鸟教程
  15. 无线网感叹号不能上网怎么办
  16. 电子签名行业2017新风向
  17. java面试常问问题及答案,附源代码
  18. API文档自动生成的方法
  19. Java集合源码系列(1)---- ArrayList详解
  20. 易语言 Sql 教程

热门文章

  1. 捷联惯导-坐标系-观测值补偿-对准-编排-时间更新-测量更新
  2. 【T6】出纳管理重新年结
  3. 抖音实战~发布短视频流程梳理
  4. 软件工程网络15个人阅读作业2(201521123044 吴敏烽)
  5. 信息安全工程师参考试题
  6. atx和matx机箱_要性能又要颜值 MATX机箱推荐榜
  7. 财务自由之路——为什么选择淘宝(上)
  8. 使用FFMPEG分离mp4/flv文件中的264视频和aac音频
  9. 幻灯片轮播图(含自动播放和手动点击播放,代码易懂)
  10. POSIX ACL详解