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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王庆功 中级黑马   /  2014-8-21 15:16  /  2452 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在做小写字母转大写字母问题时,我想让用户自己输入字符,然后对用户输入的字母进行判断。利用while循环,如果输入的不是小写字母,则一直提示用户输入。可是我自己碰到的问题是,如果用户输入的不是小写字母,在终端运行的 时候会提示两个“请输入一个小写字母”,而且我如果输入!,则会出现四个“请输入一个小写字母”。我是看了半天也找不到代码的错误,解释不了了。请大家给看下代码,运行一下,随便输入一个不是小写字母的字母,就会看到问题。
#include <stdio.h>
//函数声明
void lowerToUpper(char);
int main(){
char ch=0;
  //接收用户输入的小写字母,并判断是不是小写字母.如果不是小写字母,则反复提示。

    while ( ch <97 || ch>123)  {
        
printf("请输入一个小写字母:\n");
   
       scanf("%c",&ch);
   
  }

      //调用函数转化
   
lowerToUpper(ch);
   return 0;
}
void lowerToUpper(char num){  
    printf("%c对应的大写字母是%c\n",num,num-('a'-'A'));//'a'-'A'就是3
}


3 个回复

倒序浏览
#include <stdio.h>
//函数声明
void lowerToUpper(char);
int main(){
char ch=0;                                                     字符类型不能复制整数                                    
   //接收用户输入的小写字母,并判断是不是小写字母.如果不是小写字母,则反复提示。

    while ( ch <97 || ch>123)  {                  
         
printf("请输入一个小写字母:\n");
   
        scanf("%c",&ch);
   
   }

       //调用函数转化
   
lowerToUpper(ch) ;
   return 0;                                         函数返回类型是viod,你返回int
}
void lowerToUpper(char num){  
     printf("%c对应的大写字母是%c\n",num,num-('a'-'A'));//'a'-'A'就是3
}
回复 使用道具 举报
用二进制码转化。。。。。。
回复 使用道具 举报
呵呵且不说别的,没有人告诉你不要用scanf这个函数么,还有gets函数。scanf这货问题多多啊,你这个效果算是经典例子了。
我之前发过scanf这贴了
=============
大家学习C语言的时候,一定也有很多人告诉你不要使用scanf,那么究竟是为什么呢?又该用什么来代替呢?
scanf这个函数确实有很多问题:
1、通常,我们不在会scanf格式串中加入显式的空白,这是因为在scanf格式串中空白字符如\n并不表示换行符,而是读取并放弃连续的空白字符,而且像%d这样的格式也会舍弃前面的空白。
如果你使用%d\n这样的代码会让scanf读到非空白字符为止,而这可能需要读到下一行才能找到,这时你可以去掉\n而仅仅使用%d,但你的程序可能需要跳过那个没有读入的换行符。
设计scanf函数是用来读取自由格式的输入的,格式%d%d%d既可以读入:
1 2 3

又可以读入:
1
2
3
如果一定要用,可以使用:
scanf("%d%*[\n]",&n);

但即使这样也不能解决scanf所有的问题。
2、scanf函数对换行符的处理几乎可以说一定会带来问题,例如混用scanf和gets函数或其他任何输入例程的调用。
例如我们有这样一段代码:
int i;
char s[100];
printf("请输入一个数字:");
scanf("%d",&i);
printf("请输入一个字符串:");
gets(s);
printf("您输入的是 %d 和 \"%s\"\n",i,s);
如果这样输入:
20
hello there
这时scanf会读取20,但不会读到后面的换行符,于是换行符被gets函数读取,这就导致gets读入了空行,而"hello there"这个自负窜根本没有读到。
而如果这样输入:
20 hello there

这时代码就会符合设计初衷。
3、在scanf转换数字的时候,任何非数字的字符都会终止转换,被保留在输入流中。而这样就导致一个问题,在不使用其他手段处理时,当用户不可预料的输入非数字的字符,scanf就会被不断的阻碍,因为sanf无法跳过这些不合法的字符。
例如你希望利用返回值确保用户的输入合法时,你可能会写这样一段代码:
int num;
while(1)
{
        printf("请输入一个数字:");
        if(scanf("%d",&num) == 1)
                break;
        printf("输入不合法,请再试一次:");
}
printf("你输入的是 %d\n",num);
乍看之下似乎没什么问题,但事实上,如果你意外的输入了非数字的字符,例如字母x,那么这个程序就会陷入无限的循环中,不断的提示输入不合法,却并没有重新输入的机会。
4、scanf函数的%s格式还有着和gets函数有一样的问题,即不可知输入缓冲区的大小,如果输入行太长,就无法避免缓冲区溢出。
5、scanf的名称来自scan formatted,很明显它的设计应该更适用于相对整齐和结构化的输入,但在交互中用户的输入是缺乏格式化的,你要考虑的可能情况不仅仅是输入不合法的字符,还可能是太长、太短甚至干脆未输入、提前EOF等,而对scanf来说这些都是很麻烦的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马