2016-09-16 128 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; 
    } 
    
相關問題