Как гласит заголовок, я должен добавить несколько вещей, чтобы объяснить: " "/tab/","/"." - это вещи, которые разделяют слова в моей ситуации, еще одно замечание, что может быть больше одного пробела или точки, следующих друг за другом

Это то, что у меня есть

int countWords(char * str, int length){
       int counter = 0;

        for( int i = 0; i < length; i++){
            if(( str[i] == " ") || ( str[i] == ".") || ( str[i] == ",")){
                if(( str[i+1] != " ") || ( str[i+1] != ".") || (str[i+1] != ",")){
                    if(( str[i-1] != " ") || ( str[i-1] != ".") || (str[i-1] != ","))
                        counter++;
                }
            }
        }
        return counter;
    }

Я получаю сообщение об ошибке, в котором говорится, что я не могу сравнить int и указатель, я понимаю, откуда это исходит, но как я могу заставить его работать на самом деле?

Примечание * Я не могу использовать string.h

1
Ahmad Khateeb 28 Май 2017 в 16:29

2 ответа

Лучший ответ

В таких выражениях, как это

str[i] == " "
          ^^^

Вы пытаетесь сравнить объект типа char со строковым литералом, который неявно преобразуется в тип char *.

Вы должны использовать символьную константу вместо строкового литерала

str[i] == ' '
          ^^^

Вложенные операторы if не имеют смысла. Например, для i, равного 0, выражение str[i-1] пытается получить доступ к памяти за пределами строки.

Первый параметр функции должен быть объявлен с квалификатором const.

Функция может выглядеть следующим образом, как показано в демонстрационной программе.

#include <stdio.h>

size_t countWords( const char *s ) 
{
    size_t n = 0;

    for (size_t i = 0; s[i] != '\0'; )
    {
        while (s[i] == ' '  || 
               s[i] == '\t' || 
               s[i] == '.'  || 
               s[i] == ',') ++i;

        if (s[i] != '\0')
        {
            ++n;
            while ( s[i] != '\0' &&
                    ! ( s[i] == ' '  ||
                        s[i] == '\t' ||
                        s[i] == '.'  ||
                        s[i] == ',')) ++i;

        }
    }

    return n;
}

int main( void )
{
    char *s = "  Hello\t, World...";

    printf("%zu\n", countWords(s));
}

Выход программы

2

Или реализация функции может выглядеть так

size_t countWords(const char *s)
{
    size_t n = 0;

    while ( *s )
    {
        while (*s == ' '  ||
               *s == '\t' ||
               *s == '.'  ||
               *s == ',') ++s;

        if ( *s )
        {
            ++n;
            while ( *s &&
                    !( *s == ' '  ||
                       *s == '\t' ||
                       *s == '.'  ||
                       *s == ',' ) ) ++s;

        }
    }

    return n;
}

Более общий подход к объявлению функции заключается в следующем

size_t countWords( const char *s1, const char *s2 );

Где строка s2 указывает набор разделителей слов.

1
Vlad from Moscow 28 Май 2017 в 14:07

Если вы хотите посчитать слово, в K & R ANSI C есть один прекрасный пример. Попробуйте написать такую программу.

#include <stdio.h>
#define IN  1    /* inside a word */
#define OUT 0    /* outside a word */
/* count lines, words, and characters in input */
main()
{
   int c, nl, nw, nc, state;
   state = OUT;
   nl = nw = nc = 0;
   while ((c = getchar()) != EOF)
 {
    ++nc;
    if (c == '\n')
        ++nl;
    if (c == ' ' || c == '\n' || c = '\t')
        state = OUT;
    else if (state == OUT) 
    {
        state = IN;
        ++nw;
     }
   }
printf("%d %d %d\n", nl, nw, nc);
}

Надеюсь это поможет. :) Вы можете найти PDF-файл этой книги здесь.

0
Vishwajeet Vishu 29 Май 2017 в 14:58