我正在从用户那里读取一个字符串(C 中的字符数组),并且我正在尝试分析该字符串中特殊字符的数量。特殊字符由 ASCII 范围内除元音或空格之外的任何字符表示。
当我使用此函数时,即使用户没有输入字符串,我也会得到不同的结果。
int restCounter (char string[]) {
int unsigned specialchar = 0;
for (int i = 0; string[i] != '\0'; ++i) {
if(string[i] != ' ' || 'a' || 'e' || 'i' || 'o' || 'u' ||'A' || 'E' || 'I' || 'O' || 'U' || '\0') {
specialchar++;
}
else if(string[i] != 'a') {
specialchar++;
}
else if(string[i] != 'e') {
specialchar++;
}
else if(string[i] != 'i') {
specialchar++;
}
else if(string[i] != 'o') {
specialchar++;
}
else if(string[i] != 'u') {
specialchar++;
}
else if(string[i] != 'A') {
specialchar++;
}
else if(string[i] != 'E') {
specialchar++;
}
else if(string[i] != 'I') {
specialchar++;
}
else if(string[i] != 'O') {
specialchar++;
}
else if(string[i] != 'U') {
specialchar++;
}
else if(string[i] != '\0') {
specialchar++;
}
}
return specialchar;
}
最佳答案
C 有一个函数可以精确地执行您想要的操作 - strchr
:
#include <string.h>
unsigned int restCounter (char string[]){
unsigned int specialchar = 0;
for (size_t i = 0; string[i] != '\0'; ++i) {
if( 0 == strchr("aeiouAEIOU ", string[i])) {
++specialchar;
}
return specialchar;
}
如果有标准库函数可以实现您想要的功能,请不要编写自己的代码。
但是,如果您不仅仅是想完成工作,而是想通过手动实现计数函数来学习,则必须了解 if
的工作原理(在大多数编程语言中)。
if (s != 1) {
++special;
} else if (s != 2) {
++special;
}
仅当 s
不同时为 1 和 2 时,才不增加special
。只要考虑一下如果 s
为 2 会发生什么:第一个 if 条件为 true,这是第一个 if 主体被执行,而 else 被跳过。
你的else
语句是多余的,因为它们因这种误解而存在缺陷
如果你只想在s
既不为1又不为2的情况下增加special
,你需要按照你用英文描述的方式来编程:
if( (s != 1) && (s != 2)) {
++special;
}
因此,如果您确实想手动实现计数功能,请执行以下操作:
unsigned int restCounter (char string[]){
unsigned int specialchar = 0;
for (size_t i = 0; string[i] != '\0'; ++i) {
char c = string[i];
if (('a' != c) && ('e' != c) && ('A' != c) && ('E' != c)) {
++specialchar;
}
return specialchar;
}
它目前只使用元音 a 和 e,但我想您也看到了如何添加 i、o、u 的模式? 但请注意,我不建议使用此解决方案:它丑陋、笨拙,而且很难弄清楚它的作用。
采用第一个解决方案,除非您真的想手动编码......
顺便说一句:您不会在循环体中看到“\0”,因此不需要检查 c == '\0'
的情况。
关于c - 我的特殊字符计数器出了什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59915015/