1

首先,我对这段代码的目标是:将一个句子转换成一个 C 字符串。遍历句子并查看特定字母出现了多少实例。

这段代码有点作用,但没有给出正确的数字?不知道为什么:

#include <stdio.h>
#include <string.h>

int tracker=0;
int letterCount (char *sentence)
{
    int s=strlen(sentence);
    int i=0;


    for (i=0; i<s; i++){
        if (sentence[i]=='h') {
            tracker++;
        }
    }
    return tracker;
}

int main(int argc, const char * argv[])
{

    char *string="Hi there, what's going on? How's it going?";


    letterCount(string);

    printf("this sentensce has %i H's", tracker);


    return 0;
}

我得到的输出:

this sentensce has 2 H's

不太对。有任何想法吗?

4

4 回答 4

1

如果您的意思是不区分大小写的 H,那么这是正确的代码:

#include <stdio.h>
#include <string.h>

int tracker=0;
int letterCount (char *sentence)
{
    int s=strlen(sentence);
    int i=0;


    for (i=0; i<s; i++){
        if (sentence[i]=='h' || sentence[i]=='H') {  //'h' is not the same as 'H'
            tracker++;
        }
    }
    return tracker;
}

int main(int argc, const char * argv[])
{

    char *string="Hi there, what's going on? How's it going?";


    letterCount(string);

    printf("this sentensce has %i H's", tracker);


    return 0;
}

您刚刚在代码中拼错了 small 和大写字母。请记住,C 语言区分大小写!

于 2012-07-16T23:43:56.243 回答
0

尽管您的标签谈到了Hs 的数量,但您却在letterCount寻找hs ——在我看来,您提供的输入确实有两个小写实例h,正如它所说的那样。

如果您想将它们一起计算,您可以考虑在检查您拥有的内容之前tolower或之前过滤每个输入。toupper

于 2012-07-16T23:44:12.663 回答
0

这个数字在我看来是正确的:那句话中有 2 个“h”字符。如果您还想计算“H”字符,则需要单独检查。

于 2012-07-16T23:45:03.327 回答
0
size_t letterCount(const char* sentence, char c)
{
  size_t count = 0;

  while(sentence)
  {
    count += (*sentence == c);
    ++sentence;
  }

  return count;
}

我们在这里看到了什么?

  • 你不能有负数,所以使用像 size_t 这样的无符号类型
  • 句子不应该被修改,所以它应该是 const
  • 传入要匹配的字符
  • 句子是一个指针,如果它是空的,你就完成了。不需要调用 strlen。
  • 句子是指针,实际指针是传值的,所以可以修改(看增量,不用多做变量)
  • 布尔运算符返回 1 或 0,因此无需使用 if。(虽然,我还没有查看程序集以查看 if 分支或 add 0 是否更便宜。YMMV)
于 2012-07-17T03:50:19.097 回答