разделения строки на подстроки
Припустим у меня есть массив чаров str, который имеет буквы, пропуски и цифры. Мне нужно подсчитать количество подстрок которые разделённые двумя пробелами(В данном примере это Karmen, MIT Press, 1990), значит в переменной count должно быть число 3, но почему-то там 0. Подскажите, почему?
#include <stdio.h>
int main()
{
char str[255] = "Karmen MIT Press 1990";
int i = 0;
int count =0;
while(!str[i])
{
if(str[i] ==" " && str[i+1] == " ")
{
count++;
}
i++;
}
if(count != 0) count++;
printf("%i", count);
return 0;
}
Ответы (2 шт):
Потому что как минимум нельзя сравнивать символы со строками:
if(str[i] ==" " && str[i+1] == " ")
Надо
if(str[i] == ' ' && str[i+1] == ' ')
Еще - цикл
while(!str[i])
заканчивается на первом же ненулевом символе! Надо
while(str[i])
Ну и у вас есть такая неприятность - например, что будет, если слова разделены тремя пробелами? По заданию их вроде бы считать не надо (эти подстроки разделены не двумя пробелами), а у вас они посчитаются за две...
Ошибки верно описаны в другом ответе, а мне осталось показать другой способ решать задачу - конечный автомат.
Бежим по строке. spaces_in_row - хранит количество пробелов подряд. Если текущий символ не пробел, то spaces_in_row обнуляется, иначе увеличивается на единицу.
Если текущий символ не пробел и spaces_in_row ровно два, то мы пробежали мимо разделителя. В этом случае увеличиваем счётчик delimiters.
Надо как-то обработать пробелы в начале и в конце строки. В этом решении они игнорируются. В начале пробелы пропускает конструкция str + strspn(str, " "). В конце специальной обработки не нужно:
// gcc -std=c11 -pedantic -Wall -Wextra substrings.c
#include <stdio.h>
#include <string.h>
int count_substrings(const char *str) {
int delimiters = 0;
int spaces_in_row = 0;
for (const char *p = str + strspn(str, " "); *p != '\0'; ++p) {
if (*p == ' ') {
++spaces_in_row;
} else {
if (spaces_in_row == 2) {
++delimiters;
}
spaces_in_row = 0;
}
}
return delimiters + 1;
}
void test(const char *str) {
printf("%d \"%s\"\n", count_substrings(str), str);
}
int main()
{
test("Karmen MIT Press 1990");
test(" a b ");
test(" a b ");
test("a b c d");
test(" ");
test("");
}
3 "Karmen MIT Press 1990" 2 " a b " 2 " a b " 2 "a b c d" 1 " " 1 ""