Как изменить эту программу для подсчета количества символов, которые не являются пробелами? - PullRequest
0 голосов
/ 10 декабря 2018

Для моего задания мне нужно изменить следующую программу.Я не могу использовать strings.h.

int main(void)
{
 int c, countSpaces = 0;

printf("Type sentence:\n");

do
{
  c = getchar();     
  if (c == ' ')
    countSpaces = countSpaces + 1;
}
while (c != '\n');     

printf("Sentence contains %d Spaces.\n", countSpaces);

return 0;
}

Я пытался использовать

if (c != EOF)
    countSpaces = countSpaces + 1;
}
while (c != '\n');     

printf("Sentence contains %d Spaces.\n", countSpaces - 1);

, но это выглядит как хакерский и нелегкий способ сделать это.Может кто-нибудь помочь и / или объяснить мне, как сделать это лучше?

Заранее спасибо

Ответы [ 4 ]

0 голосов
/ 10 декабря 2018

Вы можете просто рассчитать результат, как это

int main(void)
{
    int c, countSpaces = 0;

    printf("Type sentence:\n");

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

    int countChar = c - countSpaces - 1 ; // -1 new line

    printf("Sentence contains %d Spaces.\n", countSpaces);
    printf("Sentence contains %d chars.\n", countChar);

    return 0;
}
0 голосов
/ 10 декабря 2018

Я делаю этот код, который подсчитывает длину заданной строки. Это похоже на strlen функцию.и я использовал просто scanf, и он отлично работает даже с пробелами.

#include <stdio.h>

int main()
{
    char *str = calloc(sizeof(char),50);
    int i = 0, count = 0;

    printf("Type sentence:\n");
    scanf("%[^\n]",str);

    while (str[i++] != '\0')
        count++;                    //length of the string 

    printf("%d",count);
    return 0;
}

и если вы хотите просто посчитать символы в указанной строке, используйте следующий код:

#include <stdio.h>

int main()
{
    char *str = calloc(sizeof(char),50);
    int count = 0;

    printf("Type sentence:\n");
    scanf("%[^\n]",str);

    for (int i = 0; str[i] != '\0'; i++)
        if ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z'))
            count++;


    printf("Sentence contains %d characters.\n",count);
    return 0;
} 

вывод:

Type sentence:                                                                                                             
hello world                                                                                                                
Sentence contains 10 characters.       
0 голосов
/ 10 декабря 2018

Я всегда предпочитаю использовать fgets() при чтении строки из консоли (stdin):

#include <stdio.h>

int main(void)
{
    int i;
    int length = 0;
    char buffer[1024];

    printf( "Enter some text> " );
    fgets( buffer, sizeof(buffer), stdin );

    // If the user inputs > 1024 letters, buffer will not be \n terminated
    for ( i=0; buffer[i] != '\n' && buffer[i] != '\0'; i++ )
    {
        length += 1;
    }

    printf( "length: %d\n", length );

    return 0;
}
0 голосов
/ 10 декабря 2018

Код, который я разместил, подсчитывает пробелы в предложении, я хочу изменить его, чтобы он подсчитал все символы во входном предложении.- fbN 21 сек. Назад

Есть еще один счетчик вне условия if.

#include <stdio.h>

int main(void)
{
    int c;
    int countSpaces = 0;
    int countChars = 0;

    puts("Type sentence:");

    do {
        c = getchar();
        countChars += 1;
        if (c == ' ') {
            countSpaces += 1;
        }
    } while (c != '\n');     

    printf("Sentence contains %d spaces and %d characters.\n", countSpaces, countChars);

    return 0;
}

Две ноты.foo += 1 является сокращением для foo = foo + 1 без сложности приоритета foo++.

Без блоков if или while играет с огнем.В конце концов вы случайно напишите это.

if( condition )
    do something
    whoops this is not in the condition but it sure looks like it is!

Всегда используйте блочную форму.


$ ./test
Type sentence:
foo bar baz
Sentence contains 2 spaces and 12 characters.

Обратите внимание, что здесь написано 12, потому что оно включает перевод строки.Это потому, что он проверяет, что c равно после , оно уже подсчитано.Вы можете исправить это, проверив c как прочитанное.Это довольно обычная идиома цикла «прочитай и проверь».

// Note, the parenthesis around `c = getchar()` are important.
while( (c = getchar()) != '\n' ) {
    countChars++;
    if (c == ' ') {
        countSpaces++;
    }
}
$ ./test
Type sentence:
foo bar baz
Sentence contains 2 spaces and 11 characters.
...