黑马程序员技术交流社区
标题: 输入一英文句子,将其中所有单词首字符转换成大写后输出。 [打印本页]
作者: cg287305691 时间: 2015-3-31 18:21
标题: 输入一英文句子,将其中所有单词首字符转换成大写后输出。
我不知道 哪儿错呢 求大神指点 不胜感激
- #include <stdio.h>
- #include <string.h>
- // 定义一个宏来代替字符数组的长度,便于修改
- #define N 90
- int main()
- {
- // 提示用户输入一个英文句子
- printf("请输入一个英文句子:\n");
- // 定义一个字符数组用来接收字符串
- char strArray[N];
-
- // 定义一个指针变量,并指向strArray的首字母
- char *p = strArray;
-
- // 接收用户输入
- scanf("%s",strArray);
-
- // 判断首字母是否为小写
- if (strArray[0]>'a' && strArray[0]<'z') {
- *p -= 32;
- }
-
-
- // printf("%ld",strlen(strArray));
-
- // 判断*p指针没有指向字符串末尾,并在循环中进行首字母转换
- while (*p !='\0') {
-
- // 判断当前*p指针指向不为空格
- if (*p != 32) {
- p++;
-
- }else if (*p == 32){
- p++;
- if (*p >= 97 && *p <= 122) {
- *p -= 32;
- }
- }
- }
-
- printf("%s\n",strArray);
- return 0;
复制代码
作者: moresurui0308 时间: 2015-3-31 18:46
这样用scanf貌似接受不了句子,遇到空格就停止了
作者: cg287305691 时间: 2015-3-31 19:01
scanf()是遇到空格结束了,但基础视频就学了这个,怎么办呢
作者: cg287305691 时间: 2015-3-31 19:25
我网上查了下,要用gets()函数才能输入字符串,且遇到空格不会结束
作者: kenloo 时间: 2015-4-1 19:41
#include <stdio.h>
int main()
{
char x[100];//定义一个数组接收字符串
int i;
printf("请输入英文句子\n");// 要求用户输入句子,并接收
fgets(x, sizeof(x), stdin);
x[0]=x[0]-32;
for (i=1;x[i]!='\0';i++)
{
if (x[i-1]==' ')//如果一个字母前面有空格
{
x[i]=x[i]-32;//则将该字母改为大写
}
}
for (i=0;x[i]!='\0';i++)
{
printf("%c",x[i]);
}
printf("\n");
}
作者: 13673696542 时间: 2015-4-1 20:23
我遇到这道题的时候刚开始和你一样用的sanf(),后来在网上查了查才知道应该用gets().
作者: Fire_day 时间: 2015-4-4 11:15
gets获取一行数据包括末尾的回车都获取。 所以输入一行数据,然后回车结束,系统就默认这一行数据都是输入,除开末尾的回车字符。
作者: 龙兄 时间: 2015-4-4 14:53
把那个 scanf("%s",strArray);换成gets(strArry);就行了。
作者: xiaoxiong 时间: 2015-4-4 15:53
scanf改成用gets的
作者: 常洋洋 时间: 2015-4-4 16:13
我想问一下这个代码怎么写到论坛呢?
作者: malcold 时间: 2015-4-4 17:15
用gets()试试
作者: sillypony 时间: 2015-4-4 19:19
由于存在潜在的缓冲区溢出问题,gets()已在C99下废弃,在C11下停用,如需读入整个字符串,应使用fgets()。
另一种简便的解决方法是用getchar()逐字符读入,处理后用putchar()直接输出。
- #include <stdio.h>
- #define INWORD 1 // Inside a word
- #define OUTWORD 0 // Outside a word
- char upper( char letter );
- int main( void ) {
- char c;
-
- int state = OUTWORD;
-
- printf("Type in your input:\n");
- while( (c=getchar()) != '\n' && c != EOF ) {
-
- // check for first letter of word
- if( state == OUTWORD ) {
-
- // going into a word
- if( !(c == ' ' || c == '\t') ) {
-
- putchar( upper(c) );
- state = INWORD;
- continue;
- }
- }else if ( state == INWORD ) {
-
- // getting out of a word
- if( c == ' ' || c == '\t' ) {
-
- state = OUTWORD;
- }
- }else {
-
- // Error
- return 1;
- }
-
- // printf("%c", c);
- putchar(c);
- }
-
-
- return 0;
- }
- /* Return capitalized letter. */
- char upper( char letter ) {
-
- // if is a lower case letter
- if( letter>='a' && letter<='z' ) {
-
- return letter+'A'-'a';
- }else {
-
- return letter;
- }
- }
复制代码
作者: 游戏龙 时间: 2015-4-4 19:30
同学习了
作者: 流风124 时间: 2015-4-4 21:04
本帖最后由 流风124 于 2015-4-4 21:10 编辑
我也有这道题,用gets()函数我的代码
#include <stdio.h>
#include <stdlib.h>
#define M 200
//转成大写函数的声明
void Upper(char *in);
int main(int argc, const char * argv[])
{
printf("第8题开始:\n");
char input[M] = {'\0'};
printf("请输入英文句子:\n");
//gets()函数会报warning,但是这里要接收空格,所以还是使用了
gets(input);
//调用函数找到单词的首字符,并且将其转换成大写
Upper(input);
printf("第8题结束\n");
return 0;
}
//函数:首字符转换成大写
void Upper(char in[])
{
//判定是否是单词首字母的标志
int flag = 1;
int i = 0;
while (in)
{
//当遇到空格和Tab键时,下1个字母即为首字母
if (in == ' ' || in == '\t')
{
flag = 1;
}else if (flag == 1)
{
//将首字母的小写转换成大写
if (in >= 'a' && in <= 'z')
{
in = in - ('a' - 'A');
}
flag = 0;
}
i++;
}
printf("%s\n",in);
}
作者: qiuyuhuaihua 时间: 2015-4-4 22:49
我就说一句,绝对能解决你的问题:
将你的scanf("%s", strArray) 换成 scanf("%[^\n]", strArray];就OK了 我的基础测试也是这个题,所以不会坑你的。 至于scanf("%[^\n]"是啥意思,你可以百度~~
作者: super~bin 时间: 2015-4-6 10:31
scanf可以的,用%[^/n]就行,百度百科上有
作者: 天天是我呀 时间: 2015-4-6 17:28
共同学习了
作者: qingying5810 时间: 2015-4-13 17:58
感谢亲 给我点评赠我黑马币 祝你在黑马学业有成 希望能成为同学 你是先付费还是后付?
作者: 谷飞飞 时间: 2015-4-13 20:49
好详细,学习到了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |