2011-01-18 6 views
0

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

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

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

+0

Как п объявлен? Вы проверили возвращаемое значение scanf? Он сообщает вам, сколько позиций было назначено. –

+0

Что я и я объявлял? Можете ли вы дать какой-то контекст? –

+0

Что такое символ "non-int"? –

ответ

2

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

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

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

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

int main() { 
    int n; 
    while (scanf("%d", &n)) { 
    printf("Got int: %d\n", n); 
    } 
} 
1

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

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

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

Использование зсапЕ («% с», & п), как это:

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); 
} 
1

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

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

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

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

+0

Причина, по которой я инициировал n как int, состоит в том, что цель программы - читать по строкам, получать все int и добавлять к общей сумме. Когда я нахожу конец файла, мне приходится выводить итоговое значение. Но одно из требований заключается в том, что я должен читать до тех пор, пока не будет найден EOF или не-int. – franchise842

+1

Вы ** должны использовать N-1 в строке формата, когда используете N в объявлении переменной! –

1

Учитывая, что 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; 
}