Поиск символа в 4 строках в c с использованием strchr

У меня возникли проблемы с выяснением, почему при запуске программы она не позволяет сканировать символ, который я хочу найти. Он просто переходит прямо к последнему утверждению printf.

int main()
{
char s1[100], s2[100], s3[100], s4[100];
char character
char *charSearch[3] = {s1, s2, s3, s4};
int counter = 0;
int i;

printf("Enter 4 lines of text: \n");
scanf("%s %s %s %s", &s1, &s2, &s3, &s4);
printf("Enter a any character to search:\n");

scanf("%c", &character);

for(i = 0; i < 3; i++)
{
while(charSearch[i] = strchr(  charSearch, character ))
{
counter++;
charsearch[i]++;
}
}
printf("Total occurrences of character %c is %d", character, counter);

return 0;
}

3 ответа

Решение

Перво-наперво, вы объявили массив char pointers размера 3 давая это 4 элементы:char *charSearch[3] = {s1, s2, s3, s4};

Это должно быть: char *charSearch[4] = {s1, s2, s3, s4};Эта декларация также должна быть сделана после сканирования содержимого 4 char массив {s1,s2,s3,s4} и не раньше.


Имя любого массива pointer к его первому элементу, таким образом, при использовании scanf() с char массивы, вы уже передаете нужный адрес, выполнив следующее: scanf("%s %s %s %s", s1, s2, s3, s4);

Что вы сделали здесь: scanf("%s %s %s %s", &s1, &s2, &s3, &s4); передал адрес первого адреса (звучит странно, я знаю xD).


Существует также эта раздражающая ошибка с scanf("%c", &character); который, если вы ранее сканировали что-либо, заканчивающееся new line, персонаж примет это \n как его вход. Чтобы преодолеть это, это должно быть записано как: scanf(" %c", &character);


Сейчас strchr()эта функция принимает два параметра: charpointerв строку и символ для поиска в строке, и он возвращает другой charpointer на место персонажа, если он был найден и NULL иначе.

Вместо этого нам нужно будет сделать следующее:

char *ptr = strchr( charSearch[i], character );
    while(ptr!=NULL)
    {
        ptr = strchr( ptr+1, character );
        counter++;
    }

Что он делает, это то, что в начале каждой итерации for цикл, он объявляет charpointer и инициализировать его к возвращаемому значению strchr() функция. Затем мы пока pointer не равно NULL и в каждой итерации увеличиваем наш счетчик и наш pointer чтобы он указывал на следующий символ в строке.


Окончательная рабочая версия вашего кода должна выглядеть так:

#include <stdio.h>
#include <string.h>
int main()
{
char s1[100], s2[100], s3[100], s4[100];
char character;
int counter = 0;
int i;

printf("Enter 4 lines of text: \n");
scanf("%s %s %s %s", s1, s2, s3, s4);
char *charSearch[4] = {s1, s2, s3, s4};
printf("Enter a any character to search:\n");

scanf(" %c", &character);

for(i = 0; i < 4; i++)
{
    char *ptr = strchr( charSearch[i], character );
    while(ptr!=NULL)
    {
        ptr = strchr( ptr+1, character );
    counter++;
    }
}
printf("Total occurrences of character %c is %d\n", character, counter);

return 0;
}

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

Источник: Simple C scanf не работает?

Вам поможет русский хакер.:)

Для стартеров согласно стандарту C функция main без параметров должна быть объявлена ​​как

int main( void )

Старайтесь не использовать магические числа. Компилятор должен выдать диагностическое сообщение относительно этого объявления

char *charSearch[3] = {s1, s2, s3, s4};

потому что в массиве больше инициализаторов, чем элементов.

Это заявление с scanf небезопасно и, кроме того, выражения аргумента недопустимы.

scanf("%s %s %s %s", &s1, &s2, &s3, &s4);

Желательно, чтобы в этом утверждении был указан пробел в спецификаторе формата.

scanf("%c", &character);
      ^^^^

В противном случае могут быть прочитаны пустые символы (например, новый, символ строки).

Условие в операторе while не имеет смысла

while(charSearch[i] = strchr(  charSearch, character ))

Программа может выглядеть следующим образом

#include <stdio.h>
#include <string.h>

#define SIZE 100

int main( void )
{
    char s1[SIZE], s2[SIZE], s3[SIZE], s4[SIZE];
    char * charSearch[] = { s1, s2, s3, s4 };
    const size_t N = sizeof(charSearch) / sizeof(*charSearch);
    char character;

    size_t counter = 0;

    printf( "Enter %zu lines of text: \n", N );

    for (size_t i = 0; i < N; i++)
    {
        charSearch[i][0] = '\0';
        fgets(charSearch[i], SIZE, stdin);
    }

    printf("Enter any character to search:\n");

    scanf(" %c", &character );

    for (size_t i = 0; i < N; i++)
    {
        for (char *p = charSearch[i]; ( p = strchr(p, character) ) != NULL; ++p )
        {
            ++counter;
        }
    }

    printf("Total occurrences of character %c is %zu\n", character, counter);

    return 0;
}

Вывод программы может выглядеть так

Enter 4 lines of text:
Hello World
How are you?
Stackru
I'm learning C
Enter any character to search:
e
Total occurrences of character e is 4
Другие вопросы по тегам