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

Где ошибка в коде?

Есть код, но не понимаю почему цикл while где обрабатывается istr2 выполняется только один раз? Как мне исправить данный код?
задача: например пользователь вводит buf ="1 2 3 4\n1 2 3 4\n1 2 3 4\n\n"
нужно найти строки, где находится самое минимальное число, то есть в данном случае, min_line должно быть = "1 2 3", так как самое минимальное число '1' находится в первой во второй и третьей троке
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <limits.h>
#include <string.h>

int min_num = INT_MAX;
char buf[10000];
char min_line[30] = "";
int num;
int sum_col[10] = {0};

int main()
{
    int l = 0;
    int count = 0;
    char c;
    while((c = getchar()) != EOF){
        if(c == '\n')count++;
        else count = 0;
        if(count == 2)break;
        buf[l] = c;
        l++;
        if (isdigit(c)) {
            int digit = c - '0';
            sum_col[digit]++;
        }
    }
    int line_num = 1;
    char sep2[] = "\n";
    char sep3[] = " ";
    char *istr2 = strtok(buf, sep2);
    while (istr2 != NULL) {
        char istr2_copy[1000];
        strcpy(istr2_copy, istr2);
        char *istr3 = strtok(istr2_copy, sep3);
        while (istr3 != NULL) {
            num = atoi(istr3);
            if (num < min_num) {
                min_num = num;
                strcpy(min_line, "");
                sprintf(min_line, "%d", line_num);
            } else if (num == min_num) {
                sprintf(min_line, "%s %d", min_line, line_num);
            }
            istr3 = strtok(NULL, sep3);
        }
        line_num++;
        istr2 = strtok(NULL, sep2);
    }
    printf("%s\n", min_line);
    for (int i = 0; i < 10; i++){
        int temp = sum_col[i] / 3;
        if(sum_col[i]% 3 == 2)temp++;
        printf("%d ", i);
        for(int p = 0; p < temp; p++){
            printf("*");
        }
        printf(" %d\n", sum_col[i]);
    }

    return 0;
}
  • Вопрос задан
  • 273 просмотра
Подписаться 2 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Проблема в том, что strtok нельзя вот так использовать вложенно. Вы когда разбиваете строку по пробелам, вы ломаете состояние доя разбития по строкам. Выделите сначала все строки.

Но вообще, тут не надо никаких strtok. Нельзя строки сразу читать через scanf, например? А вообще, лучше читать число и символ. И там в зависимостм от символа или начинать новую строку, или нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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