防止在c中重复输出字符

时间:2015-03-01 23:19:06

标签: c string character output repeat

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

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

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

一种非常简单的方法是标记元音&#39;使用&#39;在第一次识别后将其设置为'\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;
}

可以对代码进行大量的小清理。一个主要的问题是用while循环替换for循环。另一个注意到结果最多可以是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

显然,如果您只想要一次表示元音,无论是小写还是大写,您可以在进行比较时转换字符,并且只列出{{1中的大写元音或小写元音}}