isdigit () Ошибка сегментации - PullRequest
       0

isdigit () Ошибка сегментации

0 голосов
/ 17 октября 2010

Получение странной ошибки сегментации в следующем коде, когда я пытаюсь передать число в мое приложение в командной строке.

int offset = 3;

int main(int argc, char *argv[]) {
    // Check for arguments to see whether there is a custom offset
    if (argc == 2) {
        // If argc == 2 then we have a offset?
        if (isdigit((unsigned char)*argv[1])) {
            offset = atoi(*argv[1]);
            printf("Offset changed to: %d\n", offset);
        } else {
            printf("Offset not changed due to %s not being a number.\n", *argv[1]);
        }
    } else if(argc >= 2) {
        // If argc >= 2 then we have too many arguments
        printf("Too many arguments.");
        return 0;
    }
}

Ответы [ 4 ]

5 голосов
/ 17 октября 2010

Проблема real в вашем коде заключается в том, что вы пытаетесь вызвать функции, которые вы не объявили (вы должны использовать компилятор C89 / 90).Вы звоните isdigit.Вы звоните printf.Вы звоните atoi.Вы называете последние два неправильно.И единственная причина, по которой компилятор не может сообщить вам о неправильном вызове этих функций, заключается в том, что вы забыли объявить их.

Включите <ctype.h>, <stdlib.h> и <stdio.h> в начале вашего исходного файла, поэтомучто компилятор знает правильные типы параметров для atoi и других функций.Как только вы это сделаете, вы сможете выяснить проблему с atoi, потому что компилятор выдаст диагностическое сообщение, объясняющее проблему.Тогда вы можете изменить вызов соответственно.Некоторые компиляторы также смогут обнаружить проблему с помощью вызова printf.

Обратите внимание, что даже если вы измените вызовы atoi и printf, как рекомендовано в других ответах (например, на atoi(argv[1]))и т. д.), ваш код по-прежнему останется недействительным, потому что в C89 / 90 вызов printf без объявления его вначале приводит к неопределенному поведению (а в C99 совершенно недопустимо вызывать любую функцию без объявленияэто первое).

4 голосов
/ 17 октября 2010

argv [1] уже является строкой (типа char *), поэтому запись * argv [1] разыменовывается к первому байту, который вызывает ошибку при передаче этого байта atoi () и printf ().

Исправьте это:

offset = atoi(argv[1]);

и

printf("Offset not changed due to %s not being a number.\n", argv[1]);

2 голосов
/ 17 октября 2010

Проблема в вызове Атои.Ожидается строка.Измените его на

   offset = atoi(argv[1]);
1 голос
/ 07 сентября 2016
#include <ctype.h>
int isdigit(int c);

isdigit () ожидает проверки одного символа, argv [] - указатель на строку (массив символов).Короче говоря, он не будет проверять строки вроде "1234" , но будет проверять '1' .

...