Запуск isdigit () для отсканированного символа в C - PullRequest
2 голосов
/ 03 января 2012

Я обновляю свои навыки C и испытываю небольшие трудности с простой программой, над которой я работаю.Вот оно:

#include <stdio.h>
#include <ctype.h> // for isdigit()
#include <stdlib.h> // for atoi()

int main (int argc, const char * argv[])
{
    // first read in # of file events to follow, if not an int,
    // complain & abort
    char *input;
    input = malloc(2); // input[0] holds the character
                       // input[1] holds the terminator

    int numLines = 0;
    scanf("%c", &input);
    if (isdigit((int)input)) {
        numLines = atoi(input);
    } else {
        printf("First line of input must be int type! Aborting...\n");
        return 1;
    }
    //...
}

Проблема в том, что даже когда я ввожу число (т. Е. 2), оно все равно выводит сообщение о прерывании и завершается:

2
First line of input must be int type! Aborting...

У менятрудно понять, почему он ведет себя так, как он есть, и что я должен сделать, чтобы решить проблему.Разве спецификатор '% c' не должен указывать компилятору принимать входные данные как символ ANSI, а затем isdigit () должен правильно интерпретировать это как целое число?

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 03 января 2012

Измените это:

scanf("%c", &input);
if (isdigit((int)input)) {

на это:

scanf("%c", input);
if (isdigit(input[0])) {

Как сейчас, вы перезаписываете сам указатель, а скорее записываете в выделенную память.

Кроме того, вам нужно завершить нулем:

input[1] = '\0';

Кроме того, для этого не нужно выделять память.Вы можете обойтись просто:

char input[] = " ";
scanf("%c", input);
if (isdigit(input[0])) {
    numLines = atoi(input);

или альтернативно:

char input;
scanf("%c", &input);
if (isdigit(input)) {
    numLines = input - '0';
2 голосов
/ 03 января 2012

Измените свой код на:

char input[2] = {0};  // <<-- you don't clear the memory after malloc,
                      // your atoi might fail. No need for malloc here.
int numLines = 0;
scanf("%c", &input[0]);
if (isdigit((int)input[0])) {
    numLines = atoi(input);
} else {
    printf("First line of input must be int type! Aborting...\n");
    return 1;
}

И все хорошо.Не нужно динамически размещать здесь, это просто пустая трата усилий.

0 голосов
/ 03 января 2012

Когда вы передаете &input на scanf, вы передаете указатель на char *.Вы должны просто передать сам указатель, то есть

scanf("%c", input);
...