Съедаются символы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всех с наступающим!) помогите разобраться. Написал программу, которая переводит русский текст в транслит. Проблема в следующем: По правил у некоторых русских букв в транслите нужно выводить 2 символа. К пример я=ya Если выводить по отдельности - все работает. Если например написать "я ёж" получится yayo, то есть съедаются нужные символы. В чем может быть проблема? Заранее спасибо!
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main() 
{system("chcp 1251 > null");
int i,j,p,k;
char eee[9999];
char eee1[9999];
char eee2[9999];
startmenu:
printf("   Выберите действие: \n");
printf("\n");
printf(  "1) Исправить текст, набранный в неправильной раскладке \n"
         "2) Перевести русский текст в транслит \n");
printf("\n");
printf("   Для выбора действия введите 1 или 2:");
scanf("%c", &p);
printf("\n");
switch (p)
{
case '2': //Блок 2
printf ("Введите русский текст для перевода в транслит \n");
{   
do
{
gets (eee1);        
const int n=strlen(eee1);
for (j=0;j<n;) 
{
switch (eee1[j])
{ 
//Транслит маленькие буквы в маленькие  
case 'a': eee1[j]='a';j++;break;           //eee1[j]='a';j++; 
case 'б': eee1[j]='b';j++;break; 
case 'в': eee1[j]='v';j++;break; 
case 'г': eee1[j]='g';j++;break;
case 'д': eee1[j]='d';j++;break;     
case 'е': eee1[j]='y';j++;eee1[j]='e';j++;break; 
case 'ё': eee1[j]='y';j++;eee1[j]='o';j++;break;        //eee1[j]='y';j++;eee1[j]='o';j++;
case 'ж': eee1[j]='z';j++;eee1[j]='h';j++;break; 
case 'з': eee1[j]='z';j++;break;     
case 'и': eee1[j]='i';j++;break; 
case 'к': eee1[j]='k';j++;break; 
case 'л': eee1[j]='l';j++;break;
case 'м': eee1[j]='m';j++;break;     
case 'н': eee1[j]='n';j++;break; 
case 'о': eee1[j]='o';j++;break; 
case 'п': eee1[j]='p';j++;break;
case 'р': eee1[j]='r';j++;break;     
case 'с': eee1[j]='s';j++;break; 
case 'т': eee1[j]='t';j++;break; 
case 'у': eee1[j]='u';j++;break;
case 'ф': eee1[j]='f';j++;break;     
case 'х': eee1[j]='k';j++;eee1[j]='h';j++;break;
case 'ц': eee1[j]='t';j++;eee1[j]='s';j++;break;
case 'ч': eee1[j]='c';j++;eee1[j]='h';j++;break;
case 'ш': eee1[j]='s';j++;eee1[j]='h';j++;break;   
//case 'щ': eee1[j]='t';j++;eee1[i]='c';j++;eee2[i]='h';j++;break;
case 'ъ': eee1[j]='"';j++;break; 
case 'ы': eee1[j]='y';j++;break;
case 'ь': eee1[j]='\'';j++;break;     
case 'э': eee1[j]='e';j++;eee1[j]='h';j++; break;
case 'ю': eee1[j]='y';j++;eee1[j]='u';j++; break;
case 'я': eee1[j]='y';j++;eee1[j]='a';j++; break;
}}
printf("%s", eee1);
printf("\n");
}
while (eee!=0);
 
//system ("pause");
return 0;
break;
 
} //скобка для case2
}
}

Решение задачи: «Съедаются символы»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#ifndef __linux
#include <conio.h>
#else
#include <unistd.h>
#include <termios.h>
 
int getche()
{
    int ch;
    struct termios oldt, newt;
    tcgetattr( STDIN_FILENO, &oldt );
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    printf("%c", (char) ch);
    return ch;
}
#endif
 
#define MAX_STR_LEN 9999
 
int get_str(char *str)
{
    int i = 0, ch;
    
    while ((ch = getche()) != '\n')
    {
        if (i == MAX_STR_LEN)
        {
            break;
        }
        
        if (ch == 8 || ch == 127)
        {
            i--;
            
            if (i < 0)
            {
                i = 0;
            }
            
            printf("\b \b");
            continue;
        }
        
        str[i++] = (char) ch;
    }
    
    str[i] = '\0';
    
    return i;
}
 
int main() 
{
#ifndef __linux
    system("chcp 1251 > null");
#endif
 
    int i, j, n, choice;
    char eee1[MAX_STR_LEN];
    char out[MAX_STR_LEN << 1];
    
    do 
    {
        printf("   Выберите действие: \n\n");
        printf(  "1) Исправить текст, набранный в неправильной раскладке \n"
                 "2) Перевести русский текст в транслит \n\n");
        printf("   Для выбора действия введите 1 или 2:");
        choice = getche();
        printf("\n");
    } while(!strchr ("12", choice));
    
    switch (choice)
    {
        case '2': //Блок 2
        {
            printf ("Введите русский текст для перевода в транслит \n");
            
            while ( (n = get_str(eee1)) )
            {   
                for (j = i = 0 ; i < n; i++) 
                {
                    switch (eee1[i])
                    { 
                        //Транслит маленькие буквы в маленькие  
                        case 'а': 
                            out[j++]='а';
                            break;
                        
                        case 'б': 
                            out[j++]='b';
                            break; 
                        
                        case 'в': 
                            out[j++]='v';
                            break; 
                        
                        case 'г': 
                            out[j++]='g';
                            break;
                        
                        case 'д': 
                            out[j++]='d';
                            break;     
                        
                        case 'е': 
                            out[j++]='y';
                            out[j++]='e';
                            break; 
                        
                        case 'ё': 
                            out[j++]='y';
                            out[j++]='o';
                            break;
                        
                        case 'ж': 
                            out[j++]='z';
                            out[j++]='h';
                            break; 
                        
                        case 'з': 
                            out[j++]='z';
                            break;     
                        
                        case 'и': 
                            out[j++]='i';
                            break; 
                        
                        case 'й': 
                            out[j++]='j';
                            break;
                        
                        case 'к': 
                            out[j++]='k';
                            break; 
                        
                        case 'л': 
                            out[j++]='l';
                            break;
                        
                        case 'м': 
                            out[j++]='m';
                            break;     
                        
                        case 'н': 
                            out[j++]='n';
                            break; 
                        
                        case 'о': 
                            out[j++]='o';
                            break; 
                        
                        case 'п': 
                            out[j++]='p';
                            break;
                        
                        case 'р': 
                            out[j++]='r';
                            break;     
                        
                        case 'с': 
                            out[j++]='s';
                            break; 
                        
                        case 'т': 
                            out[j++]='t';
                            break; 
                        
                        case 'у': 
                            out[j++]='u';
                            break;
                        
                        case 'ф': 
                            out[j++]='f';
                            break;     
                        
                        case 'х': 
                            out[j++]='k';
                            out[j++]='h';
                            break;
                        
                        case 'ц': 
                            out[j++]='t';
                            out[j++]='s';
                            break;
                        
                        case 'ч': 
                            out[j++]='c';
                            out[j++]='h';
                            break;
                        
                        case 'ш': 
                            out[j++]='s';
                            out[j++]='h';
                            break;   
                        
                        case 'щ': 
                            out[j++]='t';
                            out[j++]='c';
                            out[j++]='h';
                            break;
                        
                        case 'ъ': 
                            out[j++]='"';
                            break; 
                        
                        case 'ы': 
                            out[j++]='y';
                            break;
                        
                        case 'ь': 
                            out[j++]='\'';
                            break;     
                        
                        case 'э': 
                            out[j++]='e';
                            out[j++]='h';
                            break;
                        
                        case 'ю': 
                            out[j++]='y';
                            out[j++]='u';
                            break;
                        
                        case 'я': 
                            out[j++]='y';
                            out[j++]='a';
                            break;
                        
                        case ' ':
                            out[j++]=' ';
                            break;
                        
                        default:
                            if (isgraph((int) eee1[i]))
                            {
                                out[j++]=eee1[i];
                            }
                            break;
                    }
                }
                out[j]='\0';
                printf("%s\n", out);
                
            }
            
            break;
        } //скобка для case2
    }
    
    return 0;
}

Объяснение кода листинга программы

Этот код на языке C преобразует введённые символы в верхний регистр и выводит их на экран. В случае, если введённый символ является буквой, он преобразует его в 'A' - 'Z' или 'a' - 'z', в зависимости от регистра. Если введённый символ не является буквой, он оставляет его без изменений.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5
Похожие ответы