下面给出的是我在给定字符串中查找元音的代码:
#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
函数调用中,这个 &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 (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]);
# 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);
这是使用 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;
};