A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© caopengxu 中级黑马   /  2014-7-17 11:00  /  1885 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 caopengxu 于 2014-7-17 11:33 编辑



  1. /*
  2. 8、 输入一英文句子,将其中所有单词首字符转换成大写后输出。(C语言)

  3. 解题思路:通过句子中的空格,找到单词的首字符,然后判断首字符是不是
  4. 在a~z的范围内,如果在,通过ASCII码值减32的方法转换成大写。
  5. */
  6. #include<stdio.h>

  7. int main()
  8. {
  9.     int i;
  10.     char a[100];  //用来存放输入的字符串
  11.     printf("请输入一个英文句子:\n");
  12.     gets(a);  //从键盘端输入字符串
  13.    
  14.     //首先判断句子第一个单词首字符是不是大写
  15.     if(a[0] >= 'a' && a[0] <= 'z')
  16.         a[0] -= 32;
  17.    
  18.     for(i = 0;a[i] != '\0';i++)  //当等于'\0'时退出循环
  19.     {
  20.         if(a[i] == ' ')      //判断是否等于空格
  21.         {
  22.             //如果在a~z的范围内,转换成大写
  23.             if(a[i + 1] >= 'a' && a[i + 1] <= 'z')
  24.                 a[i + 1] -= 32;
  25.         }
  26.     }
  27.     printf("转换后:%s\n",a);
  28.     return 0;
  29. }
复制代码
问题:提示gets()不安全。

9 个回复

倒序浏览
改成fgets吧。另外,循环应该判断的是a[i],不是a,你目前的写法是死循环
回复 使用道具 举报
fantacyleo 发表于 2014-7-17 11:07
改成fgets吧。另外,循环应该判断的是a,不是a,你目前的写法是死循环

不太会用这个fgets,能说说具体怎么改吗?
回复 使用道具 举报
caopengxu 发表于 2014-7-17 11:28
不太会用这个fgets,能说说具体怎么改吗?

那就用scanf("%s")吧
回复 使用道具 举报
fantacyleo 发表于 2014-7-17 11:40
那就用scanf("%s")吧

直接改scanf("%s"),输出不对,只会输出第一个单词。
回复 使用道具 举报
caopengxu 发表于 2014-7-17 11:53
直接改scanf("%s"),输出不对,只会输出第一个单词。

:L 我还以为你会用scanf。要写一个循环的。。。还是fgets算了:
fgets(c, 100, stdin);
从标准输入读取【最多】99个字符,包括换行符。最后会自动加上'\0'
回复 使用道具 举报
没事,说gets不安全其实是因为gets不作越界检查,以\0结束,所以,你必须有更大的缓冲区才行,因为你不知道你的输入内容具体是多少,所以才会出现这个情况,如果用fgets的话,那你文件中的内容就是已知的了,所以没事,你的程序可以正常运行
回复 使用道具 举报
fantacyleo 发表于 2014-7-17 12:10
我还以为你会用scanf。要写一个循环的。。。还是fgets算了:
fgets(c, 100, stdin);
从标准输入读取【 ...

是解决了,感谢。
回复 使用道具 举报
楠瓜果 发表于 2014-7-17 12:12
没事,说gets不安全其实是因为gets不作越界检查,以\0结束,所以,你必须有更大的缓冲区才行,因为你不知 ...

以前是真没用过fgets,看来不会的东西还很多,继续学习,感谢。
回复 使用道具 举报
用scanf怎么搞啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马