【问题标题】:Prevent repetition of output characters in c防止在c中重复输出字符
【发布时间】:2015-03-01 23:19:06
【问题描述】:

这里我有一个代码,用于输出字符串中使用的元音并忽略辅音。但是,如果在输入字符串中多次使用该元音,它会重复该元音的输出。有什么方法可以防止重复输出的字符或某些功能可以实现相同的任务吗?

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

int main() 
 {
  int i = 0, j = 0, k;
  char string[256], result[256];
  char vowel[10] = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};

  printf("Enter string:");
  fgets(string, 256, stdin);
  string[strlen(string) - 1] = '\0';

  while (string[i] != '\0') 
   {
    for (k = 0; k < 10; k++) 
     {
      if (vowel[k] == string[i]) 
       {
        result[j++] = string[i];
        break;
       }
     }
    i++;
   }

  result[j] = '\0';
  strcpy(string, result);

  printf ("\n");
  printf("Vowel used are: %s\n\n", string);

  return 0;
}

【问题讨论】:

  • 注意:你错过了'y'和'Y'。 printf("Vowel used are: %s\n\n", result);
  • 不包括 y 或 Y,因为它可能是也可能不是元音,这取决于它的使用方式,风险太大并且需要大量工作
  • 那么也许你需要 ngram。

标签: c string character output repeat


【解决方案1】:

您可以通过制作一个“平行数组”的标志来指示使用了哪些元音,并在使用时标记使用的字母。为方便起见,只制作小写元音,并在比较之前将字符串字符转换为小写。

// Initially, none of the vowels is used
int used[5] = {0, 0, 0, 0, 0};
char vowel[5] = {'a', 'e', 'i', 'o', 'u'};
...
for (k = 0; k < 5; k++) {
    // Check lowercase letter
    char ch = tolower(string[i]);
    // If a vowel is used, don't check it
    if (!used[k] && vowel[k] == ch) {
        result[j++] = ch;
        // Mark this vowel used to avoid using it in the future
        used[k] = 1;
        break;
    }
}

【讨论】:

    【解决方案2】:

    一个非常简单的方法是在第一次识别元音后将元音设置为'\0',将其标记为“已使用”:

    #include <stdio.h>
    #include <string.h>
    
    int main() 
     {
      int i = 0, j = 0, k;
      char string[256], result[256];
      char vowel[10] = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
    
      printf("Enter string:");
      fgets(string, 256, stdin);
      string[strlen(string) - 1] = '\0';
    
      while (string[i] != '\0') 
       {
        for (k = 0; k < 10; k++) 
         {
          if (vowel[k] == string[i]) 
           {
            result[j++] = string[i];
            vowel[k] = '\0';            // Only change in the code
            break;
           }
         }
        i++;
       }
    
      result[j] = '\0';
      strcpy(string, result);
    
      printf ("\n");
      printf("Vowel used are: %s\n\n", string);
    
      return 0;
    }
    

    可以对代码进行很多次要的清理。一个主要的问题是用for 循环替换while 循环。另一个值得注意的是,结果最多可以是 10 个字符加上 null,而且在打印之前需要将结果复制到 string 上并不明显。换行也无关紧要。它不是元音,所以它的存在不会改变结果。以下代码也测试输入是否被成功读取。

    #include <stdio.h>
    
    int main(void) 
    {
        char string[256];
    
        printf("Enter string: ");
        if (fgets(string, sizeof(string), stdin) != 0)
        {
            char vowel[10] = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
            int j = 0;
            char result[11];
            for (int i = 0; string[i] != '\0'; i++)
            {
                for (int k = 0; k < 10; k++) 
                {
                    if (vowel[k] == string[i]) 
                    {
                        result[j++] = string[i];
                        vowel[k] = '\0';
                        break;
                    }
                }
            }
            result[j] = '\0';
            printf("\nThe %d vowels used are: %s\n", j, result);
        }
    
        return 0;
    }
    

    示例运行:

    Enter string: Abyssinian Exodus
    
    The 6 vowels used are: AiaEou
    

    显然,如果您只希望一个元音表示一次,无论它是小写还是大写,您可以在进行比较时转换字符,并且您只在vowels[] 中列出大写元音或小写元音.

    【讨论】:

    • 谢谢你,我怎么会这么瞎O.o
    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 2016-06-25
    • 1970-01-01
    • 2013-03-28
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多