假设我想从stdin计算字符abcdef ...
代码:
int string[100] = "";
int a_count = 0...
while(fgets(string, sizeof(string), stdin))
{
for(int y = 0; y < 100; y ++)
{
if(string[y] == 'a') a_count++;
if(string[y] == 'b') b_count++;
...and so on...
}
//here I reset the string to empty.
}
上面的代码工作不正确(计算的数量超出预期),我在哪里犯了逻辑错误?
答案 0 :(得分:2)
您需要在实际字符串的末尾终止for
循环,而不是遍历整个数组。当你看到NUL终结器时,你需要停止。
while (fgets(string, sizeof(string), stdin) != NULL)
{
for(int y = 0; string[y] != 0; y ++)
{
if(string[y] == 'a') a_count++;
if(string[y] == 'b') b_count++;
...and so on...
}
}
您无需将字符串设置为“空”&#39;经过处理后。稍后fgets()
次来电只会覆盖它,这很好。
另外,您可能会想到更好的方法来编写实际的计数器,但这不是您提出的问题。
答案 1 :(得分:1)
问题在于,您不仅要计算字符串中的字符数,还要计算整个缓冲区中的任何垃圾。您不想这样做。循环直到字符串结尾。
此外,您可以使用简单的表/数组查找替换巨大的链式if
,如下所示:
int counts[1 << CHAR_BIT] = { 0 };
while (fgets(buf, sizeof(buf), stdin) != NULL) {
const char *p = buf;
while (*p != 0) {
counts[*p++]++;
}
}
然后,最后,您可以按如下方式检索特定字符的计数:
printf("'a': %d occurrences\n", counts['a']);
等