Problema con la posición de cadena que anexa el progtwig C

Estoy tratando de escribir un progtwig para piglatin. No estaba obteniendo la salida de lo que estoy esperando.

tome la primera letra de una “palabra” y agregue esa letra al final de la palabra con “ay” agregada al final también.

Entrada: Darrin, ¿qué estás haciendo con 500 y 100?
Salida: arrin, hatway reaay ouyay oingday ithway 500 ndaay 100?
Salida esperada: arrinday, hatway reay ouyay oingday iithway 500 nday 100?

¿Qué hay de malo con la salida? La primera palabra no se añade con ay

Ya que estoy agregando ‘ay’, necesito eliminar el ‘a’ adicional si la palabra comienza con a o termina con ‘a’. Solo necesito agregar ay al final en lugar de la primera letra + ay. Por ejemplo: la entrada es Alex y allen son 500 La salida debería ser lexay nday llenay

Además, si la letra inicial no es alfabeto, deberíamos devolver la misma palabra.

Por favor ayúdame a solucionar esto

#include  #include  #include  #include  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 = 'A') && (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]  'Z') && (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; } 

El problema real es que no vio el bosque a través de los árboles, lo que hizo que la implementación fuera demasiado difícil de leer. Para agregar insulto a la lesión, decidió romper las reglas básicas de la localidad del código (no usar las globales a menos que sea necesario) y DRY (funciones para saber si un personaje es una letra en la biblioteca estándar de cualquier idioma que pueda pensar, no lo haga) t reimplementarlo), lo que lo hizo bastante irrecuperable en lo que se refiere al mantenimiento.

Ahora, vamos a leer la descripción de la tarea de nuevo:

tome la primera letra de una “palabra” y agregue esa letra al final de la palabra con “ay” agregada al final también.

Fíjate en lo que ya se destaca por citar: palabra .

Entonces, dividiría la implementación en dos tareas distintas:

  1. Iterar a través de una oración palabra por palabra.
  2. Una vez que puedas identificar palabras de manera confiable, haz lo del piglatin.

El resultado final de podría verse así:

 #include  #include  #include  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?"); } 

Admito que la condición de continuación del bucle while es un puñado. Si tiene problemas para entender este ejemplo, es posible que desee leer sobre strspn (y su strcspn opuesto) y el operador de coma .

Primera palabra no anexada con ay

El problema no es solo que la primera palabra no se agregue con la primera letra y ay , pero siempre que tenga un carácter no alfabético al final de una palabra (dígitos / caracteres especiales, excepto el espacio), no se agregará ay esa palabra.

Por ejemplo, prueba esta entrada:

  Darrin, ¿qué haces con 500 y 100? 

Obtendrás la salida:

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

Así que principalmente, el problema está en lo último que tienes:

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

Mira, cuando aparece inmediatamente después de una palabra, el control llega a esta else y simplemente agrega , tal como es, no firstLetter la primera firstLetter y ay .

Pero no siempre se puede agregar la primera firstLetter y así en esta else , tendrá que idear algún tipo de condición, para poder separar las 500 y Darrin, , ya que las 500 también pasarán por esta else statement.

Tal vez, podría intentar verificar si firstLetter es un alfabeto o no, si lo es, a continuación, agregue la primera firstLetter y ay , de lo contrario no.

 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++; } 

Pero esto aún no procesará las palabras como 0abcdef, que tienen alfabetos, pero comienza con algún carácter que no sea del alfabeto, así que esa es tu llamada, si quieres ponerlas en la categoría de números (como 500 ), deja Como son, o para procesarlas.

Aquí está el ejemplo de trabajo.

PD: También he realizado otros cambios (que no afectan su salida), pero el cambio principal fue lo que expliqué (que sí lo hace).

EDITAR :

De los comentarios a continuación:

Si la palabra comienza con Vocal (a, e, i, o, u), a continuación, simplemente agregue la otra letra + ay

Puede escribir una función en su progtwig llamada isVowel para verificar si algún carácter es vocal o no:

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

Ahora, estás agregando ay en dos lugares en tu progtwig:

En el else if y el último:

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

Por lo tanto, puede agregar un if en las declaraciones outputBuffer[m] = 'a'; m++; outputBuffer[m] = 'a'; m++; para solo agregar esto a si el firstLetter no es una vocal:

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

Cambia esto en ambos lugares, es decir, en else if y else , y habrás terminado.

He actualizado el código en ideone