我正在用C语言编写一个程序,它可以计算一系列由用户决定的字符串中的元音数,甚至连字符串的元素数也由用户决定。问题是这个函数给出的元音数总是相同的,也就是第一个字符串的元音数。
下面是代码。
#include <stdio.h>
#include <string.h>
int vowels(char str[]);
int main(){
int n, i, x;
printf("How many strings do you want to insert?");
scanf("%d", &n);
printf("How many characters per string?");
scanf("%d", &x);
char str[x];
if(x < 10){
for(i = 0; i < n; i++){
printf("Insert a string:");
scanf("%s", str);
if(strlen(str) == x){
vowels(str);
}
else{
printf("Error\n");
}
}
}
else{
printf("Error: the number of characters must be < 10");
}
return 0;
}
int vowels(char str[]){
int i, j;
while(str[i] != '\0'){
if(str[i] == 'a' || str[i] == 'A' || str[i] == 'e' ||
str[i] == 'E' || str[i] == 'i' || str[i] == 'I' ||
str[i] == 'o' || str[i] == 'O' || str[i] == 'u' ||
str[i] == 'U'){
j++; }
i++;
}
printf("Number of vowels in the string:%d\n", j);
return 0;
}
解决方案:
你的代码包含两个错误。
i
和…j
指数vowels()
函数没有初始化,所以它们包含垃圾,会导致你的循环行为不可预测。这是因为局部变量与全局变量不同,默认情况下不初始化为0。
请使用
int i=0, j=0;
- 缓冲区
char str[x];
将不能包含一个带有x字符的字符串。事实上,字符串结束符'\0'
.
所以应该是
char str[x+1];
做了这些改动后,你的代码就可以用了。
但是… …
…但这还不够。事实上,当你得到输入的字符串时,你并没有执行任何检查,以检索到的字符数。
scanf("%s", str);
通过插入一个很长的字符串,你会发现 出界 远超 str
字符串,导致未定义的行为,很可能导致程序崩溃。
如何解决这个问题? 由于您的输入字符串的最大长度可以是9,因此只需定义一个 定长阵列:
char str[11];
为什么是11号? 首先,你的数组必须包含最多9个字符和结束符。所以是10。但它也必须包含一个额外的字符,所以可以检测到超过9个字符的输入。
之后,只要接收输入字符串,并加上
scanf("%10s", str);
通过这种方式,所有合法的输入字符串都可以被存储(从大小1到大小9)。所有长10个或更多字符的字符串将被截断为10个字符的长字符串,你的长度检查将失败。
请注意,在长字符串的情况下,所有超过前10个字符的字符将在本产品的 stdin
缓冲区。所以,如果出现错误,你需要一个机制来消耗这些字符,否则你会在下一个 scanf
. 我写了这个技巧。
while( fgets( str, 10, stdin ) != NULL )
{
if( strlen(str) < 10 )
break;
}
经过我描述的所有修改后得到的代码就是下面这个
#include <stdio.h>
#include <string.h>
int vowels(char str[]);
int main(){
int n, i, x;
printf("How many strings do you want to insert?");
scanf("%d", &n);
printf("How many characters per string?");
scanf("%d", &x);
if(x < 10){
char str[11];
for(i = 0; i < n; i++){
printf("Insert a string:");
scanf("%10s", str);
if(strlen(str) == x){
vowels(str);
}
else{
printf("Error\n");
while( fgets( str, 10, stdin ) != NULL )
if( strlen(str) < 10 )
break;
}
}
}
else{
printf("Error: the number of characters must be < 10");
}
return 0;
}
int vowels(char str[]){
int i=0, j=0;
while(str[i] != '\0')
{
if(str[i] == 'a' || str[i] == 'A' || str[i] == 'e' ||
str[i] == 'E' || str[i] == 'i' || str[i] == 'I' ||
str[i] == 'o' || str[i] == 'O' || str[i] == 'u' ||
str[i] == 'U')
{
j++;
}
i++;
}
printf("Number of vowels in the string:%d\n", j);
return 0;
}