2016-09-25 4 views
2

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

возьмите первую букву слова «word» и добавьте это письмо в конец слова с добавлением «ay» к концу.

Ввод: Даррин, что вы делаете с 500 и 100?
Выход: arrin, hatway reaay ouyay oingday ithway 500 ndaay 100?
Ожидаемый результат: arrinday, hatway reay ouyay oingday ithway 500 дн. 100?

Что с выходом: Первое слово не добавляется ау

Поскольку я добавлением «ау», мне нужно устранить лишние «а», если слово начинается с или конец с «а». Мне просто нужно добавить ay в конец вместо первой буквы + ay. Например: Вход Alex и allen равны 500. Выход должен быть lexay nday llenay

Также, если начальная буква не является алфавитом, тогда мы должны вернуть то же слово.

Пожалуйста, помогите мне решить эту

#include <stdio.h>     
#include <stdlib.h>     
#include <stdint.h>     
#include <string.h>     

static char inputBuffer[100]; 
static char outputBuffer[100]; 


void translate (void) 
{ 
    char bufferValue; 
    char firstLetter; 
    int j = 0, k = 0, m = 0; 

    printf("\n"); 

    while (j < (sizeof(inputBuffer) - 1)) 
    { 
    bufferValue = inputBuffer[j]; 

    if (((bufferValue >= 'A') && (bufferValue <= 'Z')) || ((bufferValue >= 'a') && (bufferValue <= 'z'))) 
    { 
     if (j == 0) 
     { 
     firstLetter = bufferValue; 

     } 
     else if (inputBuffer[j-1] == ' ') 
     { 
     firstLetter = bufferValue;          
     } 
     else 
     { 
     printf("%c", bufferValue); 
     outputBuffer[m] = bufferValue; m++; 
     } 
    }  
    else if ((bufferValue == ' ') && !(
    ((inputBuffer[j-1] < 'A') || 
    ((inputBuffer[j-1] > 'Z') && (inputBuffer[j-1] < 'a')) || 
    (inputBuffer[j-1] > 'z')))) 
    { 
     printf("%cay%c", firstLetter, bufferValue); 
     outputBuffer[m] = firstLetter; m++; 
     outputBuffer[m] = 'a'; m++; 
     outputBuffer[m] = 'y'; m++; 
     outputBuffer[m] = bufferValue; m++; 
     firstLetter = ' '; 
    } 
    else 
    { 
     printf("%c", bufferValue); 
     outputBuffer[m] = bufferValue; m++; 
    } 
    j++; 

    } 

    printf("\n final output: %s",outputBuffer); 

    return; 
} 

int main(void) 
{ 
    printf("enter the string\t"); 
    fflush(stdin); 
    gets(inputBuffer); 

    printf ("\nInput buffer contents: %s", inputBuffer); 
    translate(); 
    return 0;    
} 
+3

Первое наблюдение: 'sizeof' не дает вам' strlen'. –

+2

Вы должны использовать 'isalpha()' и связанные макросы с ''. Вам следует избегать использования глобальных переменных вместо параметров функции. Вы должны убедиться, что вы не переполняете свой выходной буфер. Я не уверен, что вы должны создать для входной строки. «О'Рурк и Гиффен-Хейли вышли в два часа?» (С ведущим пустым и с пунктуацией, как '' 'и' -' в словах и '?' в конце). Я думаю, я ожидал бы изолировать «слова», а затем разобраться с свинцово-латинской трансформацией каждого слова. –

+0

вы пробовали отладчик? –

ответ

0

Реальная проблема заключается в том, что вы не видели в лесу сквозь деревья, которые сделали осуществление ужасно читать. Чтобы добавить оскорбление к травме, вы решили нарушить основные правила локализации кода (не используя глобальные значения, если это необходимо) и DRY (функции, чтобы определить, существует ли символ charater в стандартной библиотеке любого языка, о котором я могу думать, t reimplement it), что сделало его довольно безвозвратным в плане обслуживания.

Теперь давайте снова прочитать описание задачи:

взять первую букву «слово» и добавив, что письмо в конце слова с «ау» добавляется в конец, а также.

Обратите внимание, что уже выделяется из-за цитирования: Слово.

Так что, я бы разделить реализацию на две задачи:

  1. Перебрать предложения слово за словом.
  2. Как только вы сможете достоверно идентифицировать слова, сделайте игрушку.

Конечный результат может выглядеть следующим образом:

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 

void piglatinize(const char* in) 
{ 
    static const char* SEP = " .,?"; // word separators 

    // Iterate input by words 
    const char *sep = NULL, *word = NULL, *end = in; 
    while (sep = end, // separators from previous word end 
      word = &end[strspn(end, SEP)], // start of word 
      end = &word[strcspn(word, SEP)], // end of word 
      *sep) // iterate until we hit terminating zero character 
    { 
     int wordlen = (int)(end - word); 
     int seplen = (int)(word - sep); 
     if (wordlen > 0 && isalpha(word[0])) // word starts with a letter, pig it! 
     { 
      char firstletter = tolower(word[0]); 
      const char* suffix = (firstletter == 'a') ? "y" : "ay"; 
      printf("%.*s%.*s%c%s", 
       seplen, sep,   // separators from previous word 
       wordlen - 1, &word[1], // word without first letter 
       firstletter, suffix); 
     } 
     else // not a real word, just print unchanged 
     { 
      printf("%.*s%.*s", seplen, sep, wordlen, word); 
     } 
    } 
} 

int main() 
{ 
    piglatinize("Darrin, what are you doing with 500 and 100?"); 
} 

Я признаю while цикл условие продолжения является горстка. Если вам не удается понять этот пример, вы можете прочитать на strspn (и его противоположность strcspn) и the comma operator.

+0

Спасибо за оптимизацию и помощь в понимании. Не могли бы вы также помочь мне устранить лишний «a». Как «есть» должно быть «reay» – Bhavya

+0

@Bhavya Описание задачи ничего не говорит об этом. Обновите задачу в своем вопросе, давая обстоятельства, при которых дополнительные «a» (или это все гласные?) следует отбросить. Трудно решить проблему с непонятной целью. –

+0

Исправлено решение пропустить дополнительное «a», если начало слова (заканчивается пигментное слово) с помощью 'a'. –

1

Первое слово не приложено ау

Проблема в том только не то, что только первое слово не добавляется по первой букве и ay , но всякий раз, когда у вас есть символ , не алфавит в конце слова (цифры/специальные символы, кроме пробела), ay не будет добавлен к этому слову.

Например, попробуйте этот вход:

Darrin, what, are you doing with 500 and 100?

Вы получите вывод:

arrin, hat, reaay ouyay oingday ithway 500 ndaay 100?

Так в основном, проблема заключается в последнем else у вас есть:

else 
{ 
    printf("%c", bufferValue); 
    outputBuffer[m] = bufferValue; m++; 
} 

См., Когда , приходит сразу после слова, управление приходит к этому else, и он просто добавляет ,, поскольку он не добавляет firstLetter и ay.

Но вы не можете всегда добавлять firstLetter и ay в этом else, вам придется придумать какое-то условие, чтобы вы могли отделить 500 и Darrin,, вызвать 500 также пройти через это else заявление.

Возможно, вы могли бы попробовать проверить, является ли firstLetter алфавитом или нет, если он есть, то добавьте firstLetter и ay, в противном случае нет.

else 
{ 
    if ((firstLetter >= 'a' && firstLetter <= 'z') || (firstLetter >= 'A' && firstLetter <= 'Z')) 
     printf("%cay", firstLetter); 
     outputBuffer[m] = firstLetter; m++; 
     outputBuffer[m] = 'a'; m++; 
     outputBuffer[m] = 'y'; m++; 
     firstLetter = ' '; 
    } 
    printf("%c", bufferValue); 
    outputBuffer[m] = bufferValue; m++; 
} 

Но это еще не обрабатывает слова, как 0abcdef,, которые делают азбуки в нем, но начать с какой-то, не буквы алфавита, так что ваш звонок, если вы хотите, чтобы поместить их в категорию номера (например 500), оставить их такими, какие они есть, или обработать их.

Here - рабочий пример.

P.S. Я также внес некоторые другие изменения (которые не влияют на ваш результат), но основное изменение было тем, что я объяснил (что делает).

EDIT:

Из приведенных ниже комментариев:

Если слово начинается с гласной (а, е, я, о, и), то просто добавить у еще первую букву + ау

Вы можете написать функцию в вашей программе под названием isVowel, чтобы проверить, если какой-то символ гласной или нет:

int isVowel(char c) 
{ 
    c = tolower(c); 
    if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') 
     return 1; 
    return 0; 
} 

Теперь вы добавляете ay в двух местах в вашей программе:

В else if и последний else:

outputBuffer[m] = firstLetter; m++; 
outputBuffer[m] = 'a'; m++; 
outputBuffer[m] = 'y'; m++; 
firstLetter = ' '; 

Таким образом, вы можете добавить if в операторах outputBuffer[m] = 'a'; m++; только добавить a если firstLetter не гласный:

outputBuffer[m] = firstLetter; m++; 
if (!isVowel(firstLetter)) 
{ 
    outputBuffer[m] = 'a'; 
    m++; 
} 
outputBuffer[m] = 'y'; m++; 
firstLetter = ' '; 

измените это в обоих местах, то есть в else if и else, и все будет готово.

Я обновил код на ideone

+0

Он работает, спасибо за помощь. Можете ли вы также помочь мне устранить гласные. – Bhavya

+0

вы хотите их устранить? От выхода? –

+0

да вот так. Если ввод есть, то вывод должен быть reay вместо reaay. – Bhavya

Смежные вопросы