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