Съедаются символы - 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', в зависимости от регистра. Если введённый символ не является буквой, он оставляет его без изменений.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д