字符计数器功能返回完全意外的值

时间:2018-01-14 06:31:48

标签: c

代码:

#include <stdio.h>
#include <ctype.h>

unsigned int countCharacter(char* string, size_t strlength, char character);

int main()
{
  char userInput[10000];
  printf("Enter string: ");
  fgets(userInput, sizeof(userInput), stdin);
  printf("\nNumber of b's in string: %u", countCharacter(userInput,sizeof(userInput) / sizeof(char), 'b'));
  return 0;
}

unsigned int countCharacter(char* string, size_t strlength, char character)
{
  unsigned int charNumber;
  for(int i = 0; i <= strlength; i++)
  {
    if(string[i] == character)
    {
      charNumber++;
    }
  }
  return charNumber;
}

程序执行时输入的字符串:iiiiiibbbbbibbiibiibb

预期输出:10

实际输出:13

有时,我会输入相同的字符串,它将以14而不是13来表示。

如何解决此问题?

4 个答案:

答案 0 :(得分:2)

您的代码中存在多个问题。

在函数.....1001. .....01100 .0.10...00 .1.01...11 . . . 中,您将输入字符串的长度传递为:

$this->validate($request, [
    'comment' => 'required|min:3|max:1000',
]);

始终为countCharacter(),因为sizeof(userInput) / sizeof(char); 10000 userInput的数组。将其更改为:

10000

在函数char中,您使用变量strlen(userInput) 作为计数器而不进行初始化:

countCharacter()

使用charNumber初始化它。

在函数unsigned int charNumber; 中,您正在迭代0循环一次:

countCharacter()

将其更改为:

for

解决这些问题,您将获得所需的输出。

答案 1 :(得分:1)

sizeof数组与字符串的长度不同。 strlen函数返回终止空字符之前的字符数。 正确的是: -

countCharacter(userInput, strlen(userInput), 'b');

此前与您输入的字符串无关 - 它始终通过10000,因为数组中包含10000 char元素。

在函数countCharacter中,您没有使用值unsigned int初始化charNumber 0。使用不确定的值,您有未定义的行为。

unsigned int charNumber = 0;

此处不需要混合signedunsigned - 您可以循环

for(size_t i = 0; i < strlength; i++)

另请注意,您需要在一个额外的时间内循环,这是不需要的。您可以在此处使用<

检查fgets()的返回值。

if(!fgets(userInput, sizeof(userInput), stdin)){
    fprintf(stderr,"Error in input\n");
}

另外printf("\nNumber of b's in string: %u\n"..) 打印输出,并附加\n。遵循这一点很好。

使用启用的所有警告编译您的程序。 gcc -Wall -Werror progname.c

答案 2 :(得分:0)

现在你拥有它的方式将会持续超过用户实际输入的内容。更改你的for循环测试,使它也在字符串[i]为0时停止。

答案 3 :(得分:0)

您的代码中存在一些逻辑错误!

1)用'_strlength'或任何变量替换'strlength'变量,因为'strlength'是一个buildin函数,因此不允许编译。

2)函数中未初始化的变量'charNumber'。所以你必须用零'0'值初始化它。

3)在_strlength之前执行循环的迭代。你将错误的条件放在for循环中,小于等于'&lt; ='。因为我们将字符数组启动为零'0'直到小于字符串的大小。

试试这个代码!我也附加了代码的输出。

#include <stdio.h>
#include <ctype.h>


unsigned int countCharacter(char* string, size_t _strlength, char character);

int main()
{
    char userInput[10000];
    printf("Enter string: ");
    fgets(userInput, sizeof(userInput), stdin);
    printf("\nNumber of b's in string: %u", countCharacter(userInput, sizeof(userInput) / sizeof(char), 'b'));
    return 0;
}

unsigned int countCharacter(char* string, size_t _strlength, char character)
{
    unsigned int charNumber=0;
    for (int i = 0; i < _strlength; i++)
    {
        if (string[i] == character)
        {
            charNumber++;
        }
    }
    return charNumber;
}

enter image description here