c fscanf для целых чисел вызывает сбой сегмента

#c #segmentation-fault #scanf

#c #ошибка сегментации #scanf

Вопрос:

РАСКРЫТИЕ ИНФОРМАЦИИ: Это домашнее задание.

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

ADD 6 6 5
ADDTERM 0 1 1
MULTIPLY 2 40

и вызовите соответствующую команду, используя заданные параметры. По какой-то причине, хотя ADD и ADDTERM работают должным образом, я получаю ошибку segfault при чтении строки умножения.

     int arg_1 = 0, arg_2 = 0, arg_3 = 0;

    while(fscanf(commands, "%s", command) != EOF)
    {
            if(strcmp(command, "ADDTERM") == 0)
            {
                    /*The following line runs fine!*/
                    fscanf(commands, "%d %d %d",
                                    amp;arg_1, amp;arg_2, amp;arg_3);
                    printf("ADDTERM, Poly: %d, Coeff: %d, Exp: %dn",
                                    arg_1, arg_2, arg_3);
                    if(polys[arg_1] == NULL)
                    {polys[arg_1] = CreatePolynomial();}
                    AddTermToPoly(polys[arg_1], arg_2, arg_3);
            }

            else if(strcmp(command, "MULTIPLY") == 0)
            {
                    /*The following line results in a segfault*/
                    fscanf(commands, "%d %d", amp;arg_1, amp;arg_2);

                    printf("MULTIPLY, Poly: %d, Multiplier: %dn",
                                    arg_1, arg_2);
                    MultiplyPoly(polys[arg_1], arg_2);
            }

            /*...*/  
   }
  

Это также проблема только на Linux-сервере моей школы. На моем домашнем компьютере все работает просто отлично, используя «gcc версии 4.4.5 (Ubuntu / Linaro 4.4.4-14ubuntu5)», тогда как в моей школе используется «gcc версии 4.1.2 20080704 (Red Hat 4.1.2-48)»

Есть идеи, почему это может быть? Мы ценим вашу помощь!

Комментарии:

1. Каково точное значение commands строки при выполнении кода?

2. commands — это не строка, а * ФАЙЛ. Разве это не так, как должно быть?

3. всегда помогает, если вы можете опубликовать минимальную программу, которая позволит другим воспроизвести вашу ошибку.

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

5. Каков размер строки «command»? Возможно, вы забыли оставить пробел для »

Ответ №1:

Вам нужно оставить место для нулевого окончания » в вашей строке. Вы были в порядке с ADDTERM, потому что в нем на 1 букву меньше, чем в MULTIPLY.