#c #optimization #time
#c #оптимизация #время
Вопрос:
Я читаю файл с заданным форматом, поэтому я вроде как знаю, чего ожидать от файла, однако, когда я пытаюсь распечатать все входные данные, просто чтобы убедиться, что код работает, консоль вылетает с исключением тайм-аута. У меня есть вложенный цикл for, поскольку я нахожу его самым простым способом обработки формата файла. Но я не знаю, есть ли лучший способ справиться с этим.
Проблема заключается в том, что кодирование для гиков является сложной задачей. Я заметил, что когда я изменяю использование переменной for в цикле for, код компилируется, но таким образом я не смог бы обрабатывать разные форматы файлов. Пока у меня есть константа в цикле for в качестве моего параметра, он выполняется. Есть идеи относительно того, почему это так?
первая строка — это количество случаев, каждая первая строка после этого сообщает мне количество узлов и количество ссылок, а в следующей строке есть связующие узлы.
Ожидаемый результат будет 4 и 3, но я еще не зашел так далеко, я все еще слежу за тем, чтобы я мог правильно читать в файле.
#include <stdio.h>
#include <ctype.h>
int nextInt();
int main() {
int c = getchar() - '0';
printf("%dn", c);
while(c > 0){
int x, y;
x = nextInt();
y = nextInt();
printf("%dMn", x, y);
int i, a, b;
for(i = 0;i<2*y; i ){
a = nextInt();
printf("M", a);
}
printf("n");
c--;
}
return 0;
}
int nextInt(){
int c, n;
int num;
while(isspace(c=getchar())){;}
num = c - '0';
while(!isspace(n = getchar())){
num = (num * 10) (n - '0');
}
return num;
}
Пример ввода выглядит примерно так:
2
4 4
0 2 0 3 1 3 2 3
4 3
0 2 0 1 0 3
вывод
4
3
Комментарии:
1. Это не имеет ничего общего с оптимизацией. Вам нужно использовать отладчик, чтобы выяснить, почему ваш код не функционирует должным образом. Как только он заработает и выдаст правильный результат, вы можете приступить к его оптимизации, когда определите конкретное узкое место. Это не оптимизация, когда вы пытаетесь заставить код действительно работать — это называется отладкой.
2. Скорее всего, вы переходите в бесконечный цикл.
3. Есть ли веская причина, по которой вы написали свой собственный код для разбора чисел вместо использования
scanf()
?4. Как вы запускаете свой код? Похоже, что он должен правильно прочитать хотя бы ваш пример файла. Даже если вы не обрабатываете многие условия ошибки, как упоминает @Barmar
5. @bruceg Если последняя строка не заканчивается новой строкой, она перейдет в бесконечный цикл поиска пробельного символа для завершения последнего числа.
Ответ №1:
while
Цикл в nextInt()
не останавливается при считывании EOF. Если последняя строка не заканчивается новой строкой, вы перейдете в бесконечный цикл, потому что он никогда не найдет разделитель после последнего числа.
int nextInt(){
int c, n;
int num;
while(isspace(c=getchar())){;}
num = c - '0';
while(!isspace(n = getchar()) amp;amp; n != EOF){
num = (num * 10) (n - '0');
}
return num;
}