Поиск символа в 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()
эта функция принимает два параметра: char
pointer
в строку и символ для поиска в строке, и он возвращает другой char
pointer
на место персонажа, если он был найден и NULL
иначе.
Вместо этого нам нужно будет сделать следующее:
char *ptr = strchr( charSearch[i], character );
while(ptr!=NULL)
{
ptr = strchr( ptr+1, character );
counter++;
}
Что он делает, это то, что в начале каждой итерации for
цикл, он объявляет char
pointer
и инициализировать его к возвращаемому значению 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