20150912华为机考2之"输入一段字符串(英文),将每个单词首字母大写后输出"

还有其他一些(隐性)要求(要不然无法通过测试):

1.如果首字母已经大写,则不用变
2.不是英文字母的不变
e.g.
Input:  hello world! this is _Ljj speaking!
Output:  Hello World! This Is _ljj Speaking!

 

 

思路写在注释里面了

/*  Input a string
 *  Output: uppercase the first character of evrey word
 *          if already uppercased, or other ascii-ch, no change on them
 *
 *  The way of thinking: using ascii
 *  e.g. 'A'+32 = 'a'
 *
**/
#include <stdio.h>
#include <string.h>
#define MAX_NUM 128

int main(){
    char s[MAX_NUM]={0};
    fgets(s, MAX_NUM, stdin);
    int len = (int)strlen(s);
    
    if(s[0]>='a' && s[0]<='z')
        s[0] -= 32;
    for(int i=0; i<len; i++){
        if(s[i] == ' '){
            if(s[i+1]>='a' && s[i+1]<='z')
                s[i+1] -= 32;
        }
    }
    printf("%s\n", s);
    
    return 0;
}

 

对于C,字符串的输入有几点需要注意:

1.  如果想要把一个字符串读到程序中,必须首先预留存储字符串的空间(一般先建立一个字符串数组,而且是已经分配好大小的。例如 char str[80];),然后使

   用输入函数来获得这个字符串;

2.  输入函数需要知道输入什么时候结束,gets(char *)知道换行才结束,结束时添加空字符 '\0',然后传给程序(所以要位'\0'预留空间);

3.  fgets(<#char *restrict#>, <#int#>, <#FILE *#>) 有三个参数,第一个是存放输入进去的字符串的,第二个是长度限制,需要填写最大允许输入字符

   数,如果填n,最多读n-1个字符,或者到换行符停止。第三个参数说明读哪个文件,从键盘读取数据时,填stdin(在stdio.h中定义);

4.  gets()不检查预留存储区是否能够容纳实际输入的数据,多出来的字符会溢出到相邻内存区域,所以不安全。书中给的一个例子,以前一些操作系统代码使用

   get(),于是有黑客利用这个弱点,用很长的输入覆盖操作系统代码,这就是曾经的“蠕虫(worm)病毒”。而fgets()限制了长度,因此更安全的方式是用

   fgets()代替gets();

5.  scanf(<#const char *restrict, ...#>)遇到空白字符(如空格,制表符,换行符)就停止,所以它更多用于获取单词(get word)而非获取

   字符(get string) ;

 

 

 

 

参考:《C Primer Plus 5th Edition》

 

 

ps: 博客园网页端对Safari支持好像不太好

转载于:https://www.cnblogs.com/Cmfvacks-IsLjj/p/4805607.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值