下面给出了我在给定字符串中查找元音的代码:
#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 (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
,这使程序更加通用和可扩展(一个字符串比多个比较更容易更改):char ch = tolower(str[i]);
if (strchr("aeiou", ch) != NULL)
printf("Vowels in the string are: %c \n", str[i]);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句