c - 我的特殊字符计数器出了什么问题?

标签 c logic

我正在从用户那里读取一个字符串(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/

相关文章:

c - 循环函数名称

objective-c - 登录窗口通知或获取有关用户注销的通知

c - Makefile 产生错误 "No rule to make target"

java - 二维数组网格玩家运动Java

haskell - forall 作为这些集合的交集

c - 当我按 ctrl + D 时,为什么我的程序会在结束之前打印一些内容?

parsing - 将字符串列表映射到对象的层次结构

java - NoElementException 但我打印元素并得到预期结果

C 链表错误未正确链接

使用预增量或后增量运算符的情况