目标是计算用户输入的char *中的所有元音。该程序具有其他功能,这是从main调用的。 我还包括stdio.h,stdbool.h和string.h
char* countWord;
int vowels;
printf("Type the word to count vowels:");
scanf("%s", &countWord);
vowels = vowelCount(countWord);
printf("%d", vowels);
以下是我使用的功能。我也试过strlen(string)也导致崩溃。
int vowelCount(char* string){
int vowels;
int i;
int size;
printf("function entered");
for (; *string; string++){
if (string[i] == 'a'){
vowels++;
} else if(string[i] == 'e'){
vowels++;
} else if(string[i] == 'i'){
vowels++;
} else if(string[i] == 'o'){
vowels++;
} else if(string[i] == 'u'){
vowels++;
}
}
return vowels;
}
我做错了什么?我是C的新手,但有其他语言的经验。 提前谢谢。
答案 0 :(得分:4)
行使未定义的行为 ......
您没有为指针指定任何空间,因此当您尝试使用它时,行为是未定义的。
只需为它腾出一些空间:
char buffer[1000];
char* countWord = buffer;
又出现了另一个错误:
scanf("%s", &countWord);
^
您不应在此处使用(&
)运算符的地址。放下吧。您正在将字符串读入指针的目标,而不是指针本身。
另请注意,您在函数中执行了一些混合代码。你正在使用一个未初始化的变量i
,但这似乎是不必要的,因为你正在递增指针string
。因此,您要删除i
并将if语句更改为
if (*string == 'a')
并确保初始化vowel
:
int vowel = 0;
答案 1 :(得分:0)
在scanf手册页中,格式说明符%s:
"匹配一系列非空白字符;下一个指针必须是指向char的指针,并且该数组必须足够大才能接受所有序列和终止NUL字符。"
您的代码提供的指针与唯一的%s说明符匹配,但是,声明为char的指针的变量的地址:& countWord是指向char的指针的类型指针。因此,scanf将匹配的序列写入(或尝试写入)大小为指向char的指针的位置,不一定是序列长度+空终止符。因此,这可能会写入未分配的内存,这是未定义的行为(通常是段错误)。简单地删除address-of运算符本身也不足以解决问题,因为简单地声明一个指向char的指针不会为你想要指向某些点的指针指定的字符分配空间。
您尝试使用scanf读取字符串时必须做的是确保分配足够的空间来存储您将读取的序列,然后将scanf指针传递给该空间。这些可以静态分配:
char countWord[512]; // Assumes input sequence will consist of no more than 511 characters, since space is needed for the terminating NUL character
或动态:
char* countWord = malloc(sizeof(char) * 512); // Same size as the above, so input still must be no more than 511 characters, but dynamically allocated so will need to be explicitly freed later to avoid leaking memory
鉴于空间已分配且足够,您可以传递countWord(以上面显示的任何一种方式定义,实际上是指向char的指针,没有所需的地址*) 如果您的scanf调用正在读取的序列是因为输入受到某些已定义的输入限制,则可以将scanf指针传递给足够的分配空间以获得最大允许输入序列大小,从而保证读取序列不会超出分配的空间。
然而,这取决于遵循所述限制的输入。更好的是您的代码可以限制它可以读取多少,因此即使您的输入源决定不按预期运行,也确保您无法访问未分配的内存。 scanf提供了一种机制,通过在指定符中包含字段宽度来实现这一点,例如:
scanf("%511s", countWord); // Reads at most 511 bytes of input into the location pointed to by countWord, plus the NUL terminator.
显然,您可以选择一个合适的数字,而不是511个字符的输入,该程序的所有有效输入都应该在其中。
注意到变量应该在被读取之前初始化的另一个答案也是正确的,但具体的崩溃更可能是由于与未分配的内存交互而不是分配但仅仅是未初始化的内存(不是从后者读取不是' t未定义的行为)。
*从技术上讲,显式声明为数组的char数组与指向char的指针之间存在一些差异,但这些差异与此问题并不特别相关。
答案 2 :(得分:0)
其他答案中已经提到了countWord
的内存分配不足。
但是在计算元音时你也会遇到使用未初始化变量的问题。
您使用string
指针进行迭代,并在其上添加一些随机值i
。
int vowelCount(char* string){
int i; // <<=== not initialized, holding ramdon garbage value
for (; *string; string++){
if (string[i] == 'a'){ // << adding random index to pointer.
...