2010-05-12 6 views
0

Это было время, и я все еще пытаюсь получить определенный код для работы. Ранее я задавал некоторые вопросы о разных командах и т. Д., Но теперь я надеюсь, что это будет последнее (объединение всех вопросов в один код).Сканирование, проверка, преобразование, копирование значений ... Как это сделать? - C -

Я в принципе хочу:

* Сканирование вход (должен быть характер?)

* Проверьте, если его номер

* Если нет, то возвращаемая ошибка

* Преобразовать что символ в поплавок

* Скопируйте значение на другую переменную (здесь я назвал ее imp)

Вот что я придумал:

EDITED КОД *

#include<stdio.h> 
#include<stdlib.h> 
#include<ctype.h> 
main(){ 
    int digits; 
    float imp=0; 
    char* alpha; 
    do{ 

    printf("Enter input\n\n"); 
    scanf("\n%c",alpha); 
    digits=isdigit(alpha); 
     if(digits==0){ 
     printf("error\n\n"); 
     } 
    imp=atof(alpha); 
    }while(digits==0); 

} 

Проблема этот код не работает вообще ... Это дает мне, что atof должны быть константным char и всякий раз, когда я пытаюсь изменить его, он просто терпит неудачу. Я расстроен и вынужден спросить здесь, потому что я считаю, что пробовал много, и я продолжаю терпеть неудачу, но я не успокоюсь, пока не получу его на работу. XD. Мне действительно нужны твои помощники.

Пожалуйста, скажите мне, почему этот код не работает, что я делаю неправильно? Я все еще учусь C и очень ценю вашу помощь :)

EDIT Ошибка данный атм:

Argument no 1 of 'isdigit' must be of type 'const int', not '<ptr>char'

EDIT Этот код компилируется нормально, но падает, когда вход будет введен ,

#include<stdio.h> 
    #include<stdlib.h> 
    #include<ctype.h> 
    main(){ 
    int digits; 
    float imp=0; 
    char* alpha=0; 
    do{ 

    printf("Enter input\n\n"); 
    scanf("\n%s",alpha); 
    digits=(isdigit(alpha[0])); 
    imp=atof(alpha); 
    }while(digits==0); 
} 
+0

Спасибо за то, что он выглядел лучше sbi, у меня нет инструментов для редактирования ... Не знаю, почему – NLed

ответ

1

Почему нет зсапЕ сделать atof преобразование для вас ?

#include <stdio.h> 
int main() 
{ 
    float imp=0; 
    while (1) 
    { 
     printf("Enter input\n\n"); 
     if (scanf("%f", &imp) < 1) break; 
    } 
    return 0; 
} 

Ваш последний пример не удается, потому что alpha является указателем NULL. Объявите его как char alpha[40];, чтобы выделить место для него. Вероятно, вы захотите использовать% 40 в строке формата, чтобы предотвратить переполнение scanfalpha.

Кроме того, используйте strtod вместо atof, и вы узнаете, было ли преобразование успешным (лучше, чем ваш метод использования isdigit, который завершится с отрицательным целым).

+0

Ahhh большое спасибо !!! Ваше объяснение получило мой код! Мне пришлось удалить массив NULL, как вы упомянули, и не допустить, чтобы scanf переполнил его !!! Легенда, спасибо :) :) – NLed

1

Вы, вероятно, нужно использовать %s вместо %c и поместить его в char массиве (char*). Вероятно, вы также получите сообщение об ошибке const char*, а не const char.

Вы не хотите читать только один символ - вы хотите, чтобы прочитать всю строку ...

EDIT:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
main(){ 
    int digits,i; 
    float imp=0; 
    char* alpha = malloc(100); /* 100 is for example */ 
    do{ 
    printf("Enter input\n\n"); 
    scanf("\n%s",&alpha); 
    for (i = 0; i != 100; ++i) 
    { 
     if (alpha[i] == '\0') 
     break; 
     if (!isdigit(alpha[i])) 
     { 
     printf("error\n\n"); 
     return ...; 
     } 
    } 
    imp=atof(alpha); 
    }while(true); 
} 
+0

Спасибо за ответ, я изменяю% s на% c, получил меньше ошибок. Теперь у меня есть новая ошибка о цифрах. Аргумент № 1 из isdigit должен иметь тип «const int», а не « char'' – NLed

+0

Я добавил пример для чего-то более близкого к тому, что вы, вероятно, захотите. – brickner

+0

Большое спасибо за эту структуру .. Я сделал мой, чтобы скомпилировать без ошибок .. но он падает, как только я ввожу что-нибудь, можете ли вы проверить отредактированный код? (см. вопрос) – NLed