Мой код работает нормально, за исключением «Цветка» и «Ритма». Выход получается таким образом: «Owerfiay», «Ythrmreay»; где «i» и «e» — это i-cap и e-cap. Я попытался проверить таблицу ASCII на случай, если что-то пошло не так, но я не могу найти эти два в таблице. Мои знания в c ++ ограничены, поэтому, когда я попытался прочитать некоторые из существующих потоков здесь и где-либо еще, я не мог идти в ногу с ними.
Вот мой код:
#include <stdio.h>
#include <string.h>
void toPigLatin(char *i){
int k,m;
char *n;
n = i;
printf("Pig Latin version: ");
if(*i=='A'||*i=='a'||*i=='E'||*i=='e'||*i=='I'||*i=='i'||
*i=='O'||*i=='o'||*i=='U'||*i=='u'){
k = 0;
while(*i!='\n'){
printf("%c",*i);
i++;
k++;
}
printf("way");
}else{
k = 1;
i++;
while(*i!='\0'){
if(*i=='A'||*i=='a'||*i=='E'||*i=='e'||*i=='I'||*i=='i'||
*i=='O'||*i=='o'||*i=='U'||*i=='u'||*i=='Y'||*i=='y'){
break;
}
k++;
i++;
}
i = n + k;
char *r;
r = n;
while(*i!='\0'){
if(*n>=65&&*n<=90)
printf("%c",*i-32);
else
printf("%c",*i);
i++;
n++;
}
i = r;
m = 0;
while (m!=k){
if(*r>=65&&*r<=90)
printf("%c",*i+32);
else
printf("%c",*i);
m++;
i++;
}
printf("ay");
}
}
int main(){
char arr[16],*i,check[16];
i = check;
printf("Enter a word: ");
scanf("%s",arr);
while(1){
strcpy(check,arr);
if(strcmp(check,"exit")==0){
break;
}
else{
printf("\n\n");
toPigLatin(arr);
printf("\n\nEnter a word: ");
scanf(" %s",arr);
}
}
return 0;
}
if(*r>=65&&*r<=90)
printf("%c",*i+32);
Это должно быть проверка *i
не *r
,
*r
первая буква в слове пользователя, F и R соответственно. Так как первый буква является заглавной буквой, ваш код пытается преобразовать ток буква от заглавных до строчных.
Ваша программа должна проверять текущую букву вместо первой.
Тем не менее, есть гораздо более простой способ конвертировать буквы в нижний регистр. Вы могли бы просто использовать tolower
от <ctype.h>
:
printf("%c", tolower(*i));
Это будет работать, даже если буква уже строчная (она не меняет строчные буквы).
Других решений пока нет …