ошибка сегментации в программировании на C - PullRequest
0 голосов
/ 18 января 2011

Я начал изучать программирование на С, и в этой программе я пытаюсь получить пользовательский ввод, а затем строку и решить, содержит ли он не-int символы.Я пробовал этот метод:

scanf("%d", &n);
if (isalpha(n))
{
 i = -1;
}

Я немного погуглил и узнал, что функция isalpha - хороший способ сделать это.Тем не менее, я получаю ошибку сегментации каждый раз, когда проверяю фрагмент выше с не-int символами (например, буквами).Любое предложение будет оценено.

Ответы [ 4 ]

2 голосов
/ 18 января 2011

Спецификатор формата %d заставляет scanf() принимать только строки цифр.Что бы то ни было, он потерпит неудачу и оставит n незаполненным (и при условии, что вы не инициализировали n раньше, он будет заполнен мусором).

Суть проблемы в том, что isalpha()ожидает значение от 0 до 255 и имеет утверждение для его применения.По крайней мере, в моем компиляторе VC ++ это вызывает сбой с нарушением прав доступа, когда ему присваивается недопустимое значение (в режиме без отладки).

Чтобы решить эту проблему, вам просто нужно переключиться на спецификатор формата %c.Преобразование n в char также было бы целесообразно, поскольку это делает ваше намерение читать один символ более понятным.

РЕДАКТИРОВАТЬ: Учитывая ваши разъяснения в комментариях, вы можете оставить всекак есть и просто проверьте возвращаемое значение scanf() вместо того, чтобы идти по маршруту isalpha().Он возвращает количество успешно прочитанных значений, поэтому, когда он встречает нецелое число или конец файла, он возвращает 0. Например:

int main() {
  int n;
  while (scanf("%d", &n)) {
    printf("Got int: %d\n", n);
  }
}
1 голос
/ 18 января 2011

Учитывая, что n является целым числом, мы можем диагностировать, что вы читаете значение в n, которое не находится в диапазоне 0..255 плюс EOF (обычно -1), так что код для isalpha(n) делает что-то вроде:

(_magic_array[n]&WEIRD_BITMASK)

, а значение n приводит к тому, что он выходит из-под контроля из памяти, следовательно, возникает ошибка сегментации.

С scanf():

  1. Возвращает количество успешных преобразований и
  2. Останавливается, когда во входном потоке есть нецелый символ (не цифра, или пробел, или знак),

Вы можете использовать:

#include <stdio.h>

int main(void)
{
    char n = 0;
    while (scanf("%c", &n) == 1)
        printf("you typed %d\n", n);
    return 0;
}
1 голос
/ 18 января 2011

Убедитесь, что у вас есть символьный буфер для хранения значения. Отсканируйте его как строку и затем используйте isalpha():

char buffer[32];
sscanf("%32s", buffer);

// loop and check characters...
if(isalpha(buffer[i])) ....

Обратите внимание на использование %32s, это для предотвращения переполнения буфера (32 == размер буфера)

1 голос
/ 18 января 2011

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

Но использование "% d" для scanf будет принимать только целочисленные значения, и вы получите "0" для n, которое не является целым числом и, следовательно, isalpha (n) всегда будет ложным, и я никогда не установлю -1.

Возможно, вы не инициализируете i и, следовательно, оно никогда не устанавливается.Если вы ссылаетесь на него позже, это, вероятно, источник вашей ошибки сегмента.

Используйте scanf ("% c", & n), например так:

int main(char** argc, int argv) {
  char n = 0;
  int i = 0;
  scanf("%c", &n); 
  if (isalpha(n)) { 
    i = -1;
  }
  printf("you typed %c, i=%d", n, i);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...