программа подсчета символов в c - PullRequest
0 голосов
/ 17 мая 2010

Количество символов на выходе соответствует фактическому номеру. плюс 3. Я не знаю почему?

Это код:

void main(void)
{

 int ch,w=0,c=0;
 do
 {
  ch=getche();
  ++c;
  if(ch==32)
  {
      ++w;
      ++c;
  }

 }while(ch!=13);
 printf("\nnum of characters is  %d",c);
 printf("\nnum of words is  %d",w);
        getch();
}

Ответы [ 9 ]

7 голосов
/ 17 мая 2010

Вы увеличиваете c в два раза для пробела.

Ваше if утверждение должно быть просто:

if(ch==32)
    ++w;

У вас есть еще один тонкий баг, такой как строка h e l l o spc spc t h e r e (с два пробела) будут записаны как три слова в вашем коде.

Вот как I написал бы это, чтобы избежать этих проблем. Обратите внимание на использование lastch, чтобы избежать подсчета последовательностей пробелов в качестве нескольких слов.

int main(void) {
    int ch = ' ', lastch, w = 0, c = 0;

    do {
        lastch = ch;
        ch = getchar();
        ++c;
        if (ch == ' ') {
            if (lastch != ' ') {
                ++w;
            }
        }
    } while (ch != '\n');

    if (lastch != ' ') {
        ++w;
    }

    printf("num of characters is  %d\n",c);
    printf("num of words is  %d\n",w);

    return 0;
}
4 голосов
/ 17 мая 2010

Вы дважды учитываете пробелы:

++c;
if(ch==32)
{
    ++w;
    ++c;
}

Вы уже увеличили c; вам не нужно делать это снова. Вы также учитываете новую строку как символ, а количество слов - это количество пробелов, которое будет коротким («foo bar» имеет два слова, но один пробел). В зависимости от того, что именно вы хотите проверить, стандартные функции, такие как isspace , могут быть проще (но они возвращают true для вещей, кроме '')

3 голосов
/ 17 мая 2010

Вы добавляете к c дважды, когда ch==32. Кроме того, вы добавляете к c, когда ch==13.

3 голосов
/ 17 мая 2010

Каждый пробел считается дважды ...

  ++c;
  if(ch==32)
  {
      ++w;
      ++c; // char is counted again
  }

Изменить код на:

  ++c;
  if(ch==32)
  {
      ++w;     
  }
3 голосов
/ 17 мая 2010
  ++c;
  if(ch==32)
  {
      ++w;
      ++c;
  }

Вы дважды сосчитали символ пробела. Удалить 2-й ++c.

2 голосов
/ 17 мая 2010

Вы увеличиваете c в два раза, если значение символа равно 32.

2 голосов
/ 17 мая 2010

Ты считаешь пробелы дважды.

Также легче читать, если вы используете символьные литералы, такие как ch==' ' вместо ch==32

1 голос
/ 17 мая 2010

Каждый пробел считается дважды

0 голосов
/ 17 мая 2010
void main(void)
{
    int ch,w=0,c=0,lastch=32;
    while((ch = getche()) != 13) //get input and check if it's ENTER key
    {
        ++c;
        if(ch == 32 && lastch != ch) //make sure two continuous spaces are not counted as a word as pointed out by paxdiablo
            ++w;
        lastch = ch;
    }
    if(lastch != 32) //for a word with no space
        ++w;
    printf("\nnum of characters is  %d",c);
    printf("\nnum of words is  %d",w);
    getch();
}

Вы можете использовать char вместо int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...