Задать вопрос
@Andrei1penguin1

Почему strcat перезаписывает переменные?

Доброго времени суток, есть такой код на C:
#include <stdio.h>
#include <string.h>

int main() {
  char delimeters[6] = " .,!?;", str, c, word;
  int count = 0;
  printf("Enter symbols combination: ");
  scanf("%s", &str);
  while ((c = getchar()) != EOF) {
    char *entry = strchr(delimeters, c);
    if (entry) {
      char *check = strchr(&word, str);
      if (check) {
        count++;
      }
      strcpy(&word, "");
    } else {
      strcat(&word, &c);
    }
  }
  printf("Result count: %d\n", count);
  return 0;
}

Должно считаться количетсво слов, в которые входит заранее заданный шаблон. И всё бы хорошо, но проблема очень странная: значение count в итоге выводится 25610 или 1656726. При том если закомментировать слияние строк (strcat), то значение count меняется как положено, вот только программа тогда не делает что надо.
Пробовал выделять большие объёмы памяти для переменной word на случай если идет переполнение, но результат тот же-переменная count меняется на непонятные большие числа.
Подскажите пожалуйста, почему так происходит?
  • Вопрос задан
  • 125 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
почему так происходит?

Потому что str и word -- это переменные размером в один символ, а в строке char delimeters[6] = " .,!?;" отсутствует 0-терминатор. Поэтому
- scanf("%s", &str); вылезет за пределы str если ввести здесь что угодно.
- strcat(&word, &c); вылезет за пределы word если в c будет не пустая строка. А в c будет неизвестно что, потому что c = getchar() не добавляет в эту строку 0-терминатор.
- strchr(delimeters, c); может вернуть что угодно, если c не входит в delimiters.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы