Целое число, принимающее случайное значение после вызова функции, которая даже не редактирует его - PullRequest
2 голосов
/ 01 июня 2019

Я выполняю программу из командной строки, она принимает строковые целочисленные строковые параметры строки, я вызываю функцию, которая читает следующий файл:

slolo te lo diré mañana al mediodía en la biblioteca

Он читает файл и печатает то, что должен распечатать, но когда он возвращается к основной функции, значение NumHijos принимает случайное значение, почему это происходит?Я даже не использую его в какой-либо функции

Основная программа, допустим, у нас есть эта командная строка ./program -d 4 File1 File2

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include "file.h"


int main(int argc, char *argv[]) {
    /*command line args*/
    int NumHijos;
    int op = 0;

    size_t len = strlen(argv[1]);
    char * operacion = malloc(len+2);
    strcpy(operacion, argv[1]);

    NumHijos = atoi(argv[2]);

    len = strlen(argv[3]);
    char * file1 = malloc(len+5);
    strcpy(file1, argv[3]);
    strcat(file1,".txt");

    len = strlen(argv[4]);
    char * file2 = malloc(len+5);
    strcpy(file2, argv[4]);   

    char vector [NumHijos];

    printf("Arg 1: %s\n",operacion); 
    printf("Arg 2: %d\n",NumHijos); 
    printf("Arg 3: %s\n", file1);
    printf("Arg 4: %s\n\n", file2); 

    abrirArchivoEntrada(file1, vector, NumHijos);

    int i = 1;

    if (operacion[1] == 'd'){
        printf("decypher\n");
    }

    else if (operacion[1] == 'c'){
        printf("crypt\n");
    }
    return 0; 
    printf("times %d", NumHijos);

}

file.h

void llenarVector(FILE *e, char texto [], int n) {
    int l;
    while (!feof(e)){
        fgets(texto, 1000, e);
    }

    l = strlen(texto);
    printf("%s\n", texto);
    printf("%d\n", l);

 fclose(e);
}

void abrirArchivoEntrada (char * nombre, char texto[], int n){
    FILE *e;
    e = fopen(nombre, "r");
            if (e == NULL) 

            {
                printf("error\n");
            }
            else { 
                printf("loaded successfully\n");    
                llenarVector(e,texto,n);
            }
}

1 Ответ

4 голосов
/ 01 июня 2019
len = strlen(argv[3]);
char * file1 = malloc(len+3);
strcpy(file1, argv[3]);
strcat(file1,".txt");

Неопределенное поведение. ".txt" нужно еще 4 символа, поэтому вам нужно выделить strlen(argv[3]) + 5 байтов для file1 указателя.

while (!feof(e)) всегда неправильно .

fgets(texto, 1000, e); (наиболее вероятно) - путь к неопределенному поведению. Указатель texto указывает на char vector[NumHijos];. Переменная инициализируется с NumHijos = atoi(argv[2]);, где argv[2] передается 2. Таким образом, vector является массивом переменной длины только с 2 байтами. Тем не менее, вы пытаетесь записать 1000 байт в vector с вызовом fgets - это, скорее всего, обращается к указателю вне границ, и происходит неопределенное поведение.

Как только происходит неопределенное поведение, у вас не может быть никаких ожиданий относительно того, что будет производить программа. Вероятно, функция fgets перезаписывает память за переменной NumHijos. Или strcat перезаписывает это. Отладьте программу, чтобы узнать. Как отлаживать небольшие программы .

я не знаю, сколько символов могло бы иметь var "texto", есть ли способ, которым я могу перепрограммировать это, чтобы мне не нужно было ставить эту 1000?

Да. Используйте getline , если у вас есть, если не переписать его самостоятельно. Написание функции, которая читает файл char с помощью char, realloc съедает некоторый целевой указатель и сохраняет прочитанный символ в этом указателе, что выглядит как хорошее обучение Си. В любом случае, вот библиотека libcs50 с ее функцией get_string(), которая может послужить хорошим ориентиром для реализации такой функции.

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