Выходные данные всегда одинаковы, даже если алгоритм работает C / C ++ - PullRequest
0 голосов
/ 10 апреля 2020

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

int main() {
int n, north_key, east_key;
char *identity, *time, *eastIdentity, *eastTime, *northIdentity, *northTime;
float latitude, longitude, max_east = MIN, max_north = MIN;
input = fopen("level2-1.in", "r");
fscanf(input, "%d", &n);
for(int i = 0; i <= n; i++) {
    char line[MAX];
    fgets(line, MAX, input);  
    identity = strtok(line, ","); 
    time = strtok(NULL, ",");

    char *aux = strtok(NULL, ",");
    latitude = std::atof(aux);
    aux = strtok(NULL, "\n");
    longitude = std::atof(aux);

    if(max_north < latitude) {
        max_north     = latitude;
        north_key     = i;
        northIdentity = identity;
        northTime     = time;
     }

    if(max_east < longitude) {
        max_east      = longitude;
        east_key      = i;
        eastIdentity  = identity;
        eastTime      = time;
    }
    printf("%d, %d\n", north_key, east_key);
}
printf("%s,%s, %s,%s\n", northIdentity, northTime, eastIdentity, eastTime);
fclose(input);
return 0;

}

1 Ответ

1 голос
/ 10 апреля 2020

Все выходные данные являются указателями на сегменты line, а line перезаписывается при каждой итерации. Кроме того, line вышла из области действия к моменту вывода результатов. Доступ к неверной памяти приводит к неопределенному поведению .

Выходные данные должны быть сохранены путем копирования их в собственное хранилище.

Настоятельно рекомендуем использовать std::string с (и, возможно, string с, с std::istringstream вместо strtok).

Примечания:

for(int i = 0; i <= n; i++)

похоже, что это может читать один за концом. i <= n позволяет i достичь n (диапазон [0, n]) в общей сложности n+1 итераций. Вы, вероятно, хотите i < n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...