2016-09-16 3 views
0

Я застрял в проблеме, заданной в книге. Проблема в том, -Почему программа дает неожиданный результат?

Прототипом Интернет новичок является членом имени B1FF, который имеет уникальный способ wriring типичный B1FF коммюнике messages.Here в .:

h3y DUD3, C 15 R1LLY C00L

Write а «B1FF фильтр», который читает сообщение, введенное пользователем и переводит его в B1FF-говорить:

Введите сообщение: Эй чувак, с Rilly круто
В B1FF-говорят: h3y DUD3, C 15 R1LLY C00L

Ваша программа должна конвертировать мессу 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



Я не понимаю, почему программа не преобразования алфавитов и почему scanf() не Принимая space в качестве персонажа?

+0

Прогулка через него с помощью отладчика. Обратите внимание на значение i - особенно на линии, где вы вычитаете один из них, а затем используйте его как индекс массива! –

+1

Почему вы используете 'scanf' для чтения одиночных символов? Знаешь, он может читать целую цепочку, верно? Также прочитайте 'man scanf', чтобы понять, что он делает с пробелами. –

+0

Правильно отложите свой код, чтобы вы могли видеть логические ошибки в ваших if-statement. –

ответ

5

Прежде всего, вы не можете цепи логического оператора ИЛИ как

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

и получить то, что вы ожидали , потому что это решает на всегда истинное состояние. [('A'||'a') принимает значение ИСТИНА]

Вы должны использовать

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++; 
} 

, которая просто слабая попытка преобразовать строчных в прописные. Если в строке присутствует не-альфа-вход, код взорвется.

Тем не менее, в отношении

почему scanf() не принимающего пространства как символ?

часть, scanf() отлично принимает пространство как вход с %c, это вы просто преобразовать его нет NUL (null) по вслепую вычитая 32 из space, который имеет ASCII value of decimal 32. A NUL не подлежит печати и не отображается на выходе.

+2

Правда, но только одна из многих проблем в этом коде. –

+0

Спасибо за ответ. Хотя мой код был неправильным, но по крайней мере 'e' должен быть преобразован в' 3'. Почему он не преобразуется? – user239887

+0

@sourav oops, что написано по ошибке. Я отредактировал его, но снова получаю тот же результат. – user239887

1

Некоторые рекомендации:

  • Не используйте много маленьких вызовов scanf("%c"...). Использовать fgets() (manpage). fgets читает целую строку с ввода, сохраняет ее в вашем буфере (включая новую строку) и в конце этого файла добавляет «\ 0» байт, чтобы вы знали, как долго строка.

  • использование toupper() (manpage). Он принимает произвольный символ в качестве входа. Если ввод представляет собой строчную букву, то выход является версией этой буквы в верхнем регистре. В противном случае выход будет таким же, как и вход.

  • Обновите массив на месте. Вам не нужны два массива. Прочитайте массив с fgets(), переверните его с помощью вашей логики перевода, обновите каждый символ, когда вы идете, затем напишите массив с помощью fputs().

  • Подробнее о операторах switch. Оператор switch сделает ваш код более компактным и более легким для чтения. Вам нужен один случай для каждого преобразования letter-> number и случай по умолчанию для всего остального.

    c = toUpper(c); 
    switch (c) { 
        case 'A': c = '4'; break; 
        case 'B': c = '8'; break; 
        .... 
        default: break; 
    } 
    
Смежные вопросы