为什么程序会产生意外的输出?

时间:2016-09-16 13:32:58

标签: c

我陷入了书中的问题。问题是 -

  

典型的互联网新手是一个名字B1FF,他有一种独特的编写消息的方式。这是典型的B1FF公报。

  H3Y DUD3,C 15 R1LLY C00L

  写一个“B1FF过滤器”,读取用户输入的消息并将其转换为B1FF-speak:

     输入消息:嘿老兄,C很酷     在B1FF中说:H3Y DUD3,C 15 R1LLY C00L

  您的程序应将消息转换为大写字母,替换某些字母的数字(A = 4,B = 8,E = 3,I = 1,O = 0,S = 5)。

我的计划 -

  #include<stdio.h>
    int main()
     {
        char arr[50]={0},ch[50]={0};
        int i=0;
        printf("\nenter the sentence : ");

        while(arr[i-1]!='\n')
        {
         scanf("%c",&arr[i]);
         i++;
        }

       i=0;

       while(arr[i]!='\n')
       {
        if(arr[i]=='e')
        ch[i]='3';
        if(arr[i]==('A'||'a') )
        ch[i]='4';
        if(arr[i]==('B'||'b'))
        ch[i]='8';
        if(arr[i]==('I'||'i'))
        ch[i]='1';
        if(arr[i]==('o'||'O'))
        ch[i]='0';
        if(arr[i]==('S'||'s'))
        ch[i]='5';

       else ch[i]=arr[i]-32;
       i++;

     }

   ch[i]='\n';
   i=0;
   printf("\nIn B1FF-SPEAK : ");

   while(ch[i]!='\n')
   {
    printf("%c",ch[i]);
    i++;
   }

   printf("\n");
   return 0;
}


计划的产出 - IMAGE



我不明白为什么程序没有转换字母表以及为什么scanf()不接受space作为字符?

2 个答案:

答案 0 :(得分:5)

首先,您不能将逻辑OR运算符链接为

  if(arr[i]==('A'||'a') )

并获得期待的内容,因为这会解决为始终为TRUE的情况。 [ ('A'||'a')评估为TRUE ]

你必须使用

  if ( (arr[i]=='A') || (arr[i] =='a'))

那就是说,

  • ch[i]=='8';ch[i]==1;基本上是语句。您正在比较并丢弃比较结果。如果您想要分配,则需要使用=

  • else ch[i]=arr[i]-32; 与之前的if语句绑定,而不是整个if 。您可以使用switch案例或if-else if-else构造来处理该部分。

  • 你没有单独处理空格。

详细说明,由于上面的第二点,你的代码基本上缩减为

while(arr[i]!='\n')
   {
    if(arr[i]==('S'||'s'))  //always false
    ch[i]='5';

   else ch[i]=arr[i]-32;   //always TRUE
   i++;
 }

这只是小写转换为UPPERCASE的不良尝试。如果字符串中存在非alpha输入,代码将会爆炸。

那说,关于

  

为什么scanf()不接受空格作为角色?

部分,scanf()完全接受空格作为%c的输入,您只需将其转换为NULnull盲目32space减去NUL<select name="quantity"> <option value="<?php echo $value1; ?>"><?php echo $value1; ?> for <?php echo $value2; ?> </select> 不可打印,并且不会出现在输出中。

答案 1 :(得分:1)

一些建议:

  • 不要使用很多小调用scanf("%c"...)。使用fgets()manpage)。 fgets从输入中读取整行,将其存储在缓冲区(包括换行符)中,并粘贴&#39; \ 0&#39;在它结尾的字节,所以你知道字符串有多长。

  • 使用toupper()manpage)。它需要一个任意字符作为输入。如果输入是小写字母,则输出是该字母的大写版本。否则,输出与输入相同。

  • 就地更新阵列。你不需要两个阵列。使用fgets()读取数组,使用翻译逻辑循环播放数组,随时更新每个字符,然后使用fputs()写出数组。

  • 了解switch语句。 switch语句将使您的代码更紧凑,更易于阅读。每个字母 - &gt;数字转换需要一个案例,其他所有内容都需要默认情况。

    c = toUpper(c);
    switch (c) {
        case 'A': c = '4'; break;
        case 'B': c = '8'; break;
        ....
        default: break;
    }