将输入字符串中每个单词的首字母变成大写
2015-09-14 19:35
489 查看
一,问题描述:
(1)目标:将输入字符串中每个单词的首字母变成大写,示例:
输入:this is a trap!
输出:This Is A Trap!
(2)实现方法:
3,问题
使用gcc编译通过,输入:this is a trap! 结果仅输出:This
逻辑上没有问题,那问题出在哪里呢?
二,问题分析
1,scanf()函数简介
功能:执行格式化输入
函数原型:int scanf(const char *format, [argument, …] );
调用格式: scanf(“<格式化字符串>”,<地址表>);
通用描述:函数返回一个整型值,它有两个参数,格式控制和参数表。格式控制就是双引号内的字符串,一般由格式控制字符和分隔符组成,后面的参数列表要和前面的格式控制字符一一对应,并且要求参数列表为指针类型。这个函数的作用是从标准输入设备获取输入值,并存储到参数列表中指针所指向的内存单元,如果读入成功,函数会返回读入成功的数据的个数(非字符个数)。
2,出错原因
scanf()函数接收的输入字段是由非空白符字符组成的字符串,当遇到空白符或达到最大字段宽度时,结束对当前输入字段的读取(C程序设计语言 第二版 BW.K 第223页)。
注:空白符包括空格、横向制表符、纵向制表符、换行符、回车符和换页符。
因此,可知问题出在:scanf(“%s”, &str);
当输入:this is a trap! 时,因字符串中含有空格,故scanf函数在读到第一个空格时即停止读入,也就是说仅读入了this,后续字符并没有读入。
三,解决方法
1,将语句:scanf(“%s”, &str);
改成:scanf(“%[^\n]”, &str);
使用gcc编译通过,重新输入:this is a trap! 结果输出:This Is A Trap!
2,分析
sanf函数转换符:[^…] 中的 ^ 表示 “不包含”
[^\n]表示读入换行符就结束读入,即以换行符作为字符串输入的结束,故此时虽然输入字符串中含空格,但scanf函数的读入操作并不会在读到空格时停止,而要等到输入换行符时,读入操作才结束。所以,此时程序能够按照设计意图运行。
三,实现方法2(利用while循环来实现)
(1)目标:将输入字符串中每个单词的首字母变成大写,示例:
输入:this is a trap!
输出:This Is A Trap!
(2)实现方法:
#include <stdio.h> #define Len 100 int main() { int i = 0; char str[Len] = { 0 }; scanf("%s", &str); //问题出在这里 for(i = 0; i < sizeof(str); i++) { if(0 == i && str[i] >= 'a' && str[i] <= 'z')// 处理第一个单词的首字符 { str[i] = str[i] + 'A' - 'a' ; } if(' ' == str[i]) // 处理其他单词的首字符 { if(str[i+1] >= 'a' && str[i+1] <= 'z'); { str[i+1] = str[i+1] + 'A' - 'a'; } } } printf("%s\n", &str); return 0; }
3,问题
使用gcc编译通过,输入:this is a trap! 结果仅输出:This
逻辑上没有问题,那问题出在哪里呢?
二,问题分析
1,scanf()函数简介
功能:执行格式化输入
函数原型:int scanf(const char *format, [argument, …] );
调用格式: scanf(“<格式化字符串>”,<地址表>);
通用描述:函数返回一个整型值,它有两个参数,格式控制和参数表。格式控制就是双引号内的字符串,一般由格式控制字符和分隔符组成,后面的参数列表要和前面的格式控制字符一一对应,并且要求参数列表为指针类型。这个函数的作用是从标准输入设备获取输入值,并存储到参数列表中指针所指向的内存单元,如果读入成功,函数会返回读入成功的数据的个数(非字符个数)。
2,出错原因
scanf()函数接收的输入字段是由非空白符字符组成的字符串,当遇到空白符或达到最大字段宽度时,结束对当前输入字段的读取(C程序设计语言 第二版 BW.K 第223页)。
注:空白符包括空格、横向制表符、纵向制表符、换行符、回车符和换页符。
因此,可知问题出在:scanf(“%s”, &str);
当输入:this is a trap! 时,因字符串中含有空格,故scanf函数在读到第一个空格时即停止读入,也就是说仅读入了this,后续字符并没有读入。
三,解决方法
1,将语句:scanf(“%s”, &str);
改成:scanf(“%[^\n]”, &str);
使用gcc编译通过,重新输入:this is a trap! 结果输出:This Is A Trap!
2,分析
sanf函数转换符:[^…] 中的 ^ 表示 “不包含”
[^\n]表示读入换行符就结束读入,即以换行符作为字符串输入的结束,故此时虽然输入字符串中含空格,但scanf函数的读入操作并不会在读到空格时停止,而要等到输入换行符时,读入操作才结束。所以,此时程序能够按照设计意图运行。
三,实现方法2(利用while循环来实现)
//method 2 #include <stdio.h> #define Len 100 int main() { int i = 0; char str[Len] = { 0 }; scanf("%[^\n]", &str);// 读入一行字符串 while(str[i] != '\0') { if(str[0] >= 'a' && str[0] <= 'z') // 处理第一个单词的首字符 { str[0] = str[0] + 'A' - 'a' ; } i++; if(' ' == str[i]) // 处理其他单词的首字符 { if(str[i+1] >= 'a' && str[i+1] <= 'z'); { str[i+1] = str[i+1] + 'A' - 'a' ; } } } printf("%s\n", &str); return 0; }
相关文章推荐
- Linux C函数参考手册(PDF版)
- Lua教程(十七):C API简介
- C#实现打造气泡屏幕保护效果
- C/C++数据对齐详细解析
- 利用C语言来求最大连续子序列乘积的方法
- 字符串的组合算法问题的C语言实现攻略
- C 语言基础教程(我的C之旅开始了)[三]
- C++中的extern “C”用法详解
- C 语言基础教程(我的C之旅开始了)[七]
- 最大子矩阵问题实例解析
- C字符串操作函数实现方法小结
- 字典树的基本知识及使用C语言的相关实现
- 详解C语言中free()函数与getpagesize()函数的使用
- C/C++ 宏详细解析
- 使用C语言解决字符串全排列问题
- C/C++实现对STORM运行信息查看及控制的方法
- 用C#生成不重复的随机数的代码
- String.Format大全(C# Java)
- 在c和c++中实现函数回调