Заменить в предложении английские слова на их русские эквиваленты - C (СИ)
Формулировка задачи:
Пожалуйста,помогите!
При вводе предложения на английском (слова разделены "_") программа должна заменить слова на русские(имеется двоичный файл, структура-база данных со словами и их переводом (struct kom {char english[20]; char russian[20];} t1[N].
Не могу понять, как именно заменить слова на их русские эквиваленты
Вот,что у меня получилось(точнее - ничего не получилось)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <locale.h>
#define N 10
struct kom {char english[20]; char russian[20];} t1[N];
int main()
{setlocale(LC_ALL, "rus");
FILE *tf;
int i=0,j=0,k;
char a[100],b[20];
tf=fopen("file1.dat","rb+");
printf("Введите предложение на английском языке:\n");
scanf("%s",a);
for (k=0;k<strlen(a);k++)
if (a[k]=='_')
{
b[j]=k;
j++;
}
for(i=0;i<N;i++)
for (k=0;k<strlen(a);k++)
{
if (strcmp(t1[i].english,a[i])==0)
a[i]=t1[i].russian;
printf("%s",a);}Решение задачи: «Заменить в предложении английские слова на их русские эквиваленты»
textual
Листинг программы
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
struct word { char english[100]; char russian[100]; } words[100];
void LoadWords(FILE* infile, struct word * words, size_t * count)
{
char str[80];
char * ptrdelim;
char *posnewline;
while (fgets(str,80,infile))
{
if ((posnewline = strchr(str, '\n')) != NULL)
*posnewline = '\0';
ptrdelim = strchr(str,'-');
if (ptrdelim != NULL)
{
strncpy(words[(*count)].english, str, ptrdelim - str);
strcpy(words[(*count)].russian, str + (ptrdelim - str + 1));
// printf("%s - %s\n", words[(*count)].english, words[(*count)].russian);
}
(*count)++;
}
fclose(infile);
}
void Replace(char * str, char * word, size_t position, size_t len)
{
char beg[100], end[100];
strncpy(beg, str, position);
*(beg + position) = '\0';
strcpy(end, str + position + len);
sprintf( str, "%s%s%s", beg, word, end);
}
void ChangeWords(char * str, struct word * words, size_t count)
{
char *start = NULL;
struct word* word = words;
for (; word < words + count; word++)
{
if ((start = strstr(str, word->english)) != NULL)
{
Replace(str, word->russian, start - str, strlen(word->english));
}
}
}
int main()
{
size_t count = 0;
FILE* infile;
char fileName[100] = "Words.txt";
char str[] = "How can i extract a particular portion of a string?";
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
infile = fopen(fileName, "r");
if (infile == NULL)
{
perror("Error in opening file for reading!");
return;
}
puts(str);
LoadWords( infile, words, &count);
ChangeWords(str, words, count);
puts("");
puts(str);
getchar();
return 0;
}
Объяснение кода листинга программы
- Объединение функций
LoadWordsиChangeWordsвместе с функциейmainобеспечивает выполнение задачи. - Функция
LoadWordsзагружает слова из файла в массив структурword. - Функция
ChangeWordsзаменяет каждое вхождение подстроки в строкеstrна соответствующую подстроку из массиваwords. - В функции
mainиспользуется функцияLoadWordsдля чтения слов из файла и сохранение их в массивеwords. - Затем используется функция
ChangeWordsдля замены каждого вхождения подстроки в строкеstrна соответствующую подстроку из массиваwords. - В конце функция
mainвыводит измененную строку на консоль. - Программа использует стандартное кодирование символов CP-1251 для ввода и вывода данных.
- Программа открывает файл
Words.txtдля чтения. - Если файл не может быть открыт, программа выводит сообщение об ошибке и завершает свое выполнение.
- В противном случае программа считывает содержимое файла в массив
wordsи выполняет замену подстрок в строкеstr. - После замены подстрок программа выводит измененную строку на консоль.
- Программа ожидает ввода данных с клавиатуры перед завершением своего выполнения.