防止在c中重复输出字符

Prevent repetition of output characters in c

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

#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] = '[=10=]';

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

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

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

  return 0;
}

您可以制作一个 "parallel array" 标志来指示使用了哪些元音,并标记使用过的字母。为了方便一点,只做小写元音,比较前把字符串字符转小写。

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

一个非常简单的方法是在元音 'used' 第一次被识别后将其设置为 '[=13=]' 来标记它:

#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] = '[=10=]';

  while (string[i] != '[=10=]') 
   {
    for (k = 0; k < 10; k++) 
     {
      if (vowel[k] == string[i]) 
       {
        result[j++] = string[i];
        vowel[k] = '[=10=]';            // Only change in the code
        break;
       }
     }
    i++;
   }

  result[j] = '[=10=]';
  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] != '[=11=]'; i++)
        {
            for (int k = 0; k < 10; k++) 
            {
                if (vowel[k] == string[i]) 
                {
                    result[j++] = string[i];
                    vowel[k] = '[=11=]';
                    break;
                }
            }
        }
        result[j] = '[=11=]';
        printf("\nThe %d vowels used are: %s\n", j, result);
    }

    return 0;
}

示例运行:

Enter string: Abyssinian Exodus

The 6 vowels used are: AiaEou

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