我正在用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个字符的字符串。实际上,字符串终止符character需要的空间'\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
缓冲区中保留。因此,如果发生错误,您需要一种机制来消耗这些字符,否则您将在next处找到它们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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句