2016-09-16 158 views
0

我被困在一本书中给出的问题。问题是 -为什么程序给出了意想不到的输出?

原型的网络新手是老乡的名字B1FF,谁拥有wriring messages.Here的典型B1FF公报:

H3Y DUD3,C 15 R1LLY C00L

写的独特方式一个“B1FF滤波器”,其读取由用户输入的消息,并将其转换成B1FF发言:

输入消息:嘿哥们,C是rilly凉爽
在B1FF发言:H3Y DUD3,C 15 R1LLY C00L

你的程序应该转换messa ge替换为大写字母,替换某些字母的数字(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



OUTPUT我不明白为什么程序未进行转换的字母和为什么scanf()不是接受space作为角色?

+0

大道直通其与调试。注意我的值 - 特别是在你从中减去一个值的行上,然后用它作为数组索引! –

+1

你为什么使用'scanf'来读取单个字符?你知道,它可以读取整个字符串,对吗?还请阅读'man scanf'以了解它在空间上做了什么。 –

+0

正确缩进您的代码,以便您可以在if语句中看到逻辑错误。 –

回答

5

首先,你不能链逻辑OR运算符像

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

,让你在做什么期待,因为这解决了一个永远的真实情况。 [('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++; 
} 

这仅仅是一个可怜企图小写转换为大写。如果字符串中存在非alpha输入,代码将会炸毁。

这就是说,对于

为什么scanf()不接受空格作为一个人物?

部分,scanf()完全接受空间作为输入与%c,这是你只是一味一个space它有一个ASCII value of decimal 32减去32转换它没有NULnull)。 A NUL不可打印,并且不会显示在输出中。

+2

是的,但只是这个代码中的许多问题之一。 –

+0

谢谢你的回答。虽然我的代码错了,但至少'e'应该转换为'3'。为什么它没有被转换? – user239887

+0

@sourav哎呀,这是写错了。我已经编辑它,但我又得到了同样的结果。 – user239887

1

一些建议:

  • 不要使用许多小的呼叫到scanf("%c"...)。使用fgets()manpage)。 fgets从输入读入整行,将其存储在缓冲区(包括换行符)中,并在其末尾粘贴'\ 0'字节,以便知道该字符串有多长。

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

  • 就地更新数组。你不需要两个数组。用fgets()读取数组,用您的翻译逻辑对其进行循环,随时更新每个字符,然后用fputs()将数组写出。

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

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