计算输入字符串的长度c语言,C语言统计输入的字符串的长度
很多情况下,我们需要知道用户输入的字符串的长度,以便进行下一步工作。
很多读者立即想起了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语言统计输入的字符串的长度相关推荐
- c语言 统计数量用count_C语言编程中统计输入的行数以及单词个数的方法
统计输入的行数 标准库保证输入文本流以行序列的形式出现,每一行均以换行符结束.因此,统计行数等价于统计换行符的个数. #include /* count lines in input */ main( ...
- 如何在C语言程序中统计输入汉字的个数
C中的汉字用"机内码",一个汉字两字节,最高位都是1,所以可以用下列代码求得一个字符串里汉字的个数: #include<stdio.h> #include<str ...
- C语言-编写函数统计输入文本中单词的个数,单词之间用空格符、换行符、跳格符隔开,用@作为输入结束标志。
#include<stdio.h> #define IN 1//标志在一个单词的内部 #define OUT 0//标志在一个单词的外部 int countword();//函数说明语句 ...
- C语言-编写程序统计输入的字符中空格符、换行符和横线跳格(制表)符的个数,用!号结束输入。
#include<stdio.h> #include<ctype.h> main() {long n=0;char ch;while((ch=getchar())!='!')/ ...
- C语言怎么实现单词下落,如何用c语言实现单词统计
如何用c语言实现单词统计 输入一串字符串,输出其中有多少个单词. 代码如下:#include #include #define SIZE 20 int main(){ char str[SIZE]={ ...
- [C语言]使用指针将输入的多个字符串按长度升序排序
[C语言]使用指针将输入的多个字符串按长度升序排序 1.题目 2.完整代码 3.截图 1.题目 编写一个函数,利用指针将输入的多个字符串按长度升序排序 要求:子函数 void StrSort(char ...
- C语言:从键盘输入一个长度不定的字符串[C_004]
目录 背景: Solution: 方案一:那就不要字符串 方案二:动态申请内存 背景: 在很多时候,会遇到从外部按要求输入字符串的情形,有些是明确了长度,有些只是给定了最大长度,而有些没有规定长度.对 ...
- c语言编写计算单词长度,编写一个程序,打印输入中单词长度的直方图
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define inside 1 #define outside 0 /*编写一个程序,统计并打印输入单词不同长度的个数,并打印输入中单 ...
- java输入一个字符给c赋值_C语言字符串的输入输出
字符串的输出 在C语言中,输出字符串的函数有两个: puts():直接输出字符串,并且只能输出字符串. printf():通过格式控制符 %s 输出字符串.除了字符串,printf() 还能输出其他类 ...
- c语言怎么用scanf输入字母,c语言输入字符串(c语言怎么用scanf输入字符串)
但是实际操作发现我的字符串无论输入的多长多短,都是输入的什么输出的就. 在C语言中,输入输出字符串有以下两种方式:1 用scanf/printf输入输出.scanf/printf是C语言的格式化输入输 ...
最新文章
- iOS 模仿微信的照片选择器
- python数据类型详解
- numpy中的转置Transpose和.T以及轴对换swapaxis
- netty源码分析系列——EventLoop
- 百度地图的立体效果来实现
- 【机器学习基础】数学推导+纯Python实现机器学习算法4:决策树之ID3算法
- 标志寄存器EFLAGES
- open函数返回-1_4.6 linux的系统调用执行探究(1)
- 苹果cms资源站360影视
- Transformer、BERT等模型学习笔记
- 对于开发 0 bug 代码的思考——Design by Contract 契约设计
- sklearn.preprocessing.StandScaler
- 扫描文件怎么设置到服务器,如何为扫描仪添加局域网功能
- html中class类怎么写,HTML class 属性 | 菜鸟教程
- 无线网感叹号不能上网怎么办
- 电子签名行业2017新风向
- java面试常问问题及答案,附源代码
- API文档自动生成的方法
- Java集合源码系列(1)---- ArrayList详解
- 易语言 Sql 教程