我正在尝试为piglatin编写程序。我没有得到我期待的输出。
取一个“单词”的第一个字母,然后将该字母附加到单词的末尾,并将“ay”添加到结尾。
输入:Darrin,你在用500和100做什么?
输出:arrin,hatway reaay ouyay oingday ithway 500 ndaay 100?
预计产量:arrinday,在今天500天的100天期间,还有一天的时间
输出有什么问题:第一个单词没有附加ay
由于我附加'a',我需要消除额外的'a',如果单词以a开头或者以'a'结尾。我只需要在最后添加一个而不是第一个字母+ 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;
}
答案 0 :(得分:1)
第一个单词未附加ay
问题不在于只有第一个单词没有被第一个字母和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。我也做了一些其他改动(这不会影响你的输出),但主要的改变是我解释的(确实如此)。
修改强>:
来自以下评论:
如果单词以Vowel(a,e,i,o,u)开头,那么只需添加y else first first + ay
您可以在程序中编写一个名为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
上的代码答案 1 :(得分:0)
真正的问题是你没有通过树木看到森林,这使得实施方案难以阅读。为了增加对伤害的侮辱,你决定打破代码局部性的基本规则(除非必要,否则不使用全局变量)和DRY(用于判断字符是否存在于我能想到的任何语言的标准库中的函数,不要'重新实现它,这使得它在维护方面几乎无法恢复。
现在,让我们再次阅读任务说明:
取一个“单词”的第一个字母,然后将该字母附加到单词的末尾,并将“ay”添加到结尾。
请注意引用的内容:字。
因此,我将实现分为两个不同的任务:
最终结果可能如下:
#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。