Member 14009930 Ответов: 2

Вычисление частоты строки в файле на языке Си


while(fgets(temp1, 512, my_file) != NULL) {
if((strstr(temp1, str)) != 0) {
l++;
printf(" match found on line: %d\n", sr_num);
printf("\n%s  \n", temp1);


result++;
                }



/*this is returning same result  for strings like mc Larenc,mc Cody ,mc Larenc*/


Что я уже пробовал:

мне нужно проверить частоту строк и добавить частоту строк,таких как mc Larenc ,mc Cody,mc Larenc, mc Donell, просто проверяя первые два символа, а не всю строку

Richard MacCutchan

Каковы значения в temp1 и str?

Richard MacCutchan

Но что же это такое ценности в них? Как мы можем помочь вам, если вы не дадите нам полную информацию?

Richard MacCutchan

Ну, вы все еще не объяснили, с чем вы сравниваете. Каково (в четвертый раз) фактическое значение в str переменная?

Richard MacCutchan

Ну, я только что попробовал это сделать, и он правильно возвращает количество совпадений как 1. Все, что вы делаете в своем коде, отличается от того, что вы думаете. Кроме того, вероятно, было бы более разумно использовать strcmp, а не strstr.

Richard MacCutchan

Боюсь, что это еще один неполный вопрос. Поговорка - это не сработало." это абсолютно ничего нам не говорит.

Пожалуйста, отредактируйте свой вопрос, удалите то, что там есть, и покажите фактический код, который вы используете. Также покажите фактические значения переменных, которые вы используете в сравнениях.

Кстати, даже если ваш код сравнивал только первые две буквы, "mc", в своих тестах, он все равно не должен получить счет 5, так как в ваших данных есть только 4 вхождения этой строки.

Richard MacCutchan

Смотрите мое решение ниже.

CPallini

Вы знаете, вы ПК не можете догадаться, что, например, Мак Коди это всего лишь одна струна. Вы должны обеспечить соблюдение этого правила (то есть вы должны написать код для этого).

Richard MacCutchan

Итак, покажите нам, что содержится в двух строках, которые вы пытаетесь сравнить. Мы не можем догадаться, как выглядят ваши данные.

Patrice T

Мы ничего не можем сделать с этим кодом, он не является полным. Показать код, который может компилироваться.
Показать пример ввода str и пример файла с фактическим и ожидаемым выходом.

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

jsc42

Если вас интересуют только первые два символа, то почему вы сравниваете целые строки? Не проще ли просто проверить первые 2 символа, если это все, что вам нужно, например if (temp1[0] == str[0] && temp1[1] == str[1]) printf("same\n"); else printf("different\n"); ?

2 Ответов

Рейтинг:
2

Richard MacCutchan

Не используйте scanf (как уже предлагалось), вместо этого используйте gets_s, _getws_s | Майкрософт документы[^] который будет читать полную строку.

Не используйте strstr, так как он не выполняет полного сравнения. Воспользуйся strcmp, wcscmp, _mbscmp | Microsoft Docs[^] (как уже предлагалось).


Рейтинг:
0

Richard MacCutchan

Ладно, я нашел твою проблему. Вы с помощью функции scanf, чтобы получить строку для поиска, с помощью следующего кода:

printf("enter the name you want to search \n");
scanf("%s",j);

result = Search_in_File("name.csv", j);

Но, scanf не воспринимает пробел как разделитель токенов, поэтому если вы введете "УК Larenc", он будет извлекать только в "МК", т. е. значение, которое будет сохранено в Дж. Таким образом, вы подсчитываете каждую строку, содержащую строку "mc". С помощью strcmp возможно, это помогло бы тебе найти ошибку раньше.


Member 14009930

но использование strcmp возвращает все значения, которые есть в списке

Richard MacCutchan

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

Member 14009930

вот весь код который я запускаю чувак а это мой файл



о Ленан
Маккормак Дан
Серовато-коричневый
о Линаге
Макморрис
Отрава
Макмортах
Китон
Китон
Китон
Китон
о ffeagh
Хефернон
Косби
Масе
Масе
Стаффорд
Саттон
Саттон
Алкок
Защитник
Стаффорд
Стаффорд
Кландалк
Чиверы
Мак Коди
Деббон
Вынес
Викарии
ффенен
Браун
Маккилпатрик
Макмеррох
Vinecomb
Уикен
старрфорд
Синнотт
Синнот
Синнот
Уикен
Уоллер
Уикен
Сырники
Мак Муртаг
Мак Коди
Мак Донелл
Уоллер
Вагстафф
Вагстафф
Данн
Мак Ларенк



просто введите любое случайное значение из этого для str и запустите программу, вы получите значения частоты, но она показывает неправильное значение, когда я ввожу что-то вроде "mc Larenc", которое имеет пространство между ними

Richard MacCutchan

Да, и я уже сказал вам почему.