查找字符串中的元音

瓦卜哈夫·卡特雷

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

#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我得到了想要的输出。

所以,谁能帮我理解,我错在哪里!!

scanf函数调用中, this&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函数创建转换为小写的当前字符的副本,然后仅执行小写比较。IE:
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]);
}
  • 另一种选择是将 if 语句中的比较替换为对 的调用strchr,这使程序更加通用和可扩展(一个字符串比多个比较更容易更改):
char ch = tolower(str[i]);
if (strchr("aeiou", ch) != NULL)
    printf("Vowels in the string are: %c \n", str[i]);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章