查找字符串中的元音

问题描述 投票:0回答:3

下面给出的是我在给定字符串中查找元音的代码:

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

int main() {
    char str[100];
    int i, str_length;

    //scanf("%[^\n]%*c", &str[100]);
    fgets(str, sizeof(str), stdin);
    str_length = strlen(str);
    for (i = 0; i < str_length; i++) {
        if (str[i] == 'a' || str[i] == 'e' ||
            str[i] == 'i' || str[i] == 'o' || 
            str[i] == 'u' || str[i] == 'A' ||
            str[i] == 'E' || str[i] == 'I' ||
            str[i] == 'O' || str[i] == 'U')
        {
            printf("Vowels in the string are: %c \n", str[i]);
        }
    }
    return 0;
}

我只是想知道,为什么

scanf("%[^\n]%*c",&str[100])
在我的代码中不起作用? 因为我尝试使用
scanf
多次执行我的程序,但没有成功。

使用

fgets
后,我得到了所需的输出。

所以,任何人都可以帮助我理解我错在哪里!!

c string scanf
3个回答
3
投票

scanf
函数调用中,这个
&str[100]
接受一个指向
str
的指针,使其指向索引为 100 的元素(超出数组末尾),取消引用它,然后获取那个(不存在的)元素。这很可能会导致尝试无效写入,这可能会被操作系统捕获并终止您的程序。无论如何,字符串都没有写入正确的位置。

相反,您希望参数指向

str
第一个元素的内存位置,即:

scanf("%[^\n]%*c", str);

也就是说,使用

fgets
更好,因为它接受防止缓冲区溢出的大小参数。也可以为
scanf
指定大小,但由于它是格式说明符的一部分,因此它不能是变量;只有一个硬编码常量:

scanf("%99[^\n]%*c", str);

请注意,这是针对 99 元素的,因为还需要为空终止符 (

\0
) 留出空间。有关 scanf 的更多信息,请参阅
此处
。但同样,使用
fgets
不太容易出错,因此是首选。

一些额外的建议

  • 不使用参数的
    main
    函数的典型签名是
    int main(void)
  • 如果输入是单个换行符,则
    scanf
    版本会失败。两个版本都因无输入而失败。检查输入(和输出)函数的返回值始终是一个好主意。
  • 在 for 循环内部,您可以使用 tolower 函数创建当前字符转换为小写的副本,然后仅执行小写比较。即:
for (i = 0; i < str_length; i++) {
    char ch = tolower(str[i]);
    if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
        printf("Vowels in the string are: %c \n", str[i]);
}
  • 另一种选择是通过调用
    strchr
    来替换 if 语句中的比较,这使得程序更加通用和可扩展(一个字符串比多次比较更容易更改):
char ch = tolower(str[i]);
if (strchr("aeiou", ch) != NULL)
    printf("Vowels in the string are: %c \n", str[i]);

0
投票
# This is my different solution to this question #



char vowels[] = "AEIOUaeiou";
int vowel = 0, consonants = 0, space = 0;
for (int i = 0; str[i] != '\0'; i++)
{
    if (str[i] == ' ')
    {
        space++;
    }

    for (int j = 0; vowels[j] != '\0'; j++)
    {
        if (vowels[j] == str[i])
        {
            vowel++;
        }
    }
}
consonants = strlen(str) - (vowel + space);

0
投票

这是使用 Javascript 查找给定长度子字符串中元音最大数量的最佳方法

var maxVowels = function(s, k) {
       const isVowel = (c) => {
            return c === 'a' || c === 'e' || c === 'i' || c === 'o' || c === 'u';
    };

    let cnt = [...s.slice(0, k)].filter(isVowel).length;
    let ans = cnt;

    for (let i = k; i < s.length; ++i) {
        cnt += isVowel(s[i]) - isVowel(s[i - k]);
        ans = Math.max(ans, cnt);
    }

    return ans;

};

© www.soinside.com 2019 - 2024. All rights reserved.