我是C/C++的新手,正在学习基础知识。我想写一个程序,将元音的数量打印为人名中的vowCount
,这是一个输入。我有两个char
数组,name[20]
用于保存用户输入的string
,vowels[]
用于保存元音。
如果两个char
在阵列之间匹配,我希望vowCount
增加1。如果我输入CCD_ 8作为"0";John";,嵌套的for-loop
、vowels[i]
打印a,e,i,o,u,J,o,h,n
。我在这里的错误是什么,我不明白为什么vowels[i]
也打印name[20]
中的元素?并且vowCount
总是与name[]
的大小相同,包括字符串末尾的null
指针。
#include <stdio.h>
#include <string.h>
using namespace std;
int main() {
char name[20];
char vowels[] = {'a','e','i','o','u'};
int vowCount = 0;
printf("Enter your name: ");
scanf("%19s",name);
for(uint16_t counter = 0; name[counter]!= ' ' ;counter++ ){
char test = name[counter];
printf("CHECKING: %c n", test);
for(uint8_t i =0; vowels[i] != ' '; i++){
printf("COMPARING WITH VOWEL: %cn", vowels[i]);
if(test == vowels[i]){
vowCount++;
}
}
}
printf("n%i", vowCount);
}
此阵列
char vowels[] = {'a','e','i','o','u'};
不包含字符串:以零字符' '
结束的字符序列。
因此,对于环路
for(uint8_t i =0; vowels[i] != ' '; i++){
调用未定义的行为,因为数组CCD_ 18的两个元素都不等于CCD_。
相反,您可以像一样声明数组
char vowels[] = {'a','e','i','o','u', ' ' };
或者您可以使用字符串文字来初始化数组
char vowels[] = { "aeiou" };
这与相同
char vowels[] = "aeiou";
请注意,在C中没有名称空间。如果你想写一个C程序,那么删除这行
using namespace std;
此外,程序中也没有使用头<string.h>
中的任何声明。
一个C程序可以看起来像
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main( void )
{
char name[20];
const char vowels[] = "aeiou";
size_t vowCount = 0;
printf("Enter your name: ");
scanf( "%19s", name );
for ( size_t i = 0; name[i]!= ' ' ; i++ )
{
unsigned char c = name[i];
printf("CHECKING: %c n", c );
if ( strchr( vowels, tolower( c ) ) != NULL )
{
vowCount++;
}
}
printf( "n%zun", vowCount );
}