字符串位置追加C程序

时间:2016-09-25 18:45:41

标签: c

我正在尝试为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;             
} 

2 个答案:

答案 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追加ayelse,你必须提出某种条件,所以你可以分开500Darrin,,原因500也将通过此else声明。

也许,您可以尝试检查firstLetter是否为字母,如果是,则附加firstLetteray,否则不会。

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 ifelse这两个地方更改此设置,您就可以完成。

我已更新ideone

上的代码

答案 1 :(得分:0)

真正的问题是你没有通过树木看到森林,这使得实施方案难以阅读。为了增加对伤害的侮辱,你决定打破代码局部性的基本规则(除非必要,否则不使用全局变量)和DRY(用于判断字符是否存在于我能想到的任何语言的标准库中的函数,不要'重新实现它,这使得它在维护方面几乎无法恢复。

现在,让我们再次阅读任务说明:

  

取一个“单词”的第一个字母,然后将该字母附加到单词的末尾,并将“ay”添加到结尾。

请注意引用的内容:

因此,我将实现分为两个不同的任务:

  1. 逐字逐句地翻译。
  2. 一旦你能够可靠地识别出单词,就可以做一下。
  3. 最终结果可能如下:

    #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