2015-05-27 3 views
0

Я написал программу, которая печатает цифры чисел, которые я ввел в терминал в словах. Ex, 123 вернул бы одну две три. Когда я пытаюсь запустить программу, после того, как я вставил свой номер, он говорит, что программа перестала работать. Я использую Codeblocks. Что-то не так с кодом? Он компилируется, но возвращает ошибку -1073741510.Программа для печати цифр цифр, на словах

#include <stdio.h> 

int main (void) 
{ 
    long long int m = 0, n, digit; 

    printf ("Whats your number? \n"); 
    scanf ("%lli", &n); 

    if (n < 0){ 
     n = -n; 
     printf ("negative "); 
    } 

    if (n = 0) 
     printf ("zero "); 

    else { 
     while (n != 0){      //this is to reverse the number 
     m = m*10 + n%10; 
     n = n/10; 
     } 

     while (m != 0){ 
     digit = m%10; 
     switch (digit){ 

      case 0: 
       printf ("zero "); 
       break; 
      case 1: 
       printf ("one "); 
       break; 
      case 2: 
       printf ("two "); 
       break; 
      case 3: 
       printf ("three "); 
       break; 
      case 4: 
       printf ("four "); 
       break; 
      case 5: 
       printf ("five "); 
       break; 
      case 6: 
       printf ("six "); 
       break; 
      case 7: 
       printf ("seven "); 
       break; 
      case 8: 
       printf ("eight "); 
       break; 
      case 9: 
       printf ("nine "); 
       break; 
     } 
     m = m/10; 
     } 
    } 
    return 0; 
} 

ответ

3

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

scanf ("%lli", n); 

Это должно быть: аргумент

scanf ("%lli", &n); 

Scanf нуждается быть адрес переменной, чтобы поместить результат в.

0

Для начала, вы можете изменить эту строку:

scanf ("%lli", n); //passed variable 

Для этого:

scanf ("%lli", &n); // 
// ^ ^ // Always: When you need to change the value of an 
        // argument, you need to pass the address 
        // of the value, not the value itself. 

Редактировать (для ответа на вопрос в комментариях)
Вы меняющийся в значение n до 0, чтобы он мог быть правильно оценен. Вы хотите сравнить это. После следующее редактирование сделано, вход, похоже, обрабатывается правильно ...
Изменить линию:

if (n = 0) //ASSIGNS value of 0 to value of n 

в

if (n == 0) //COMPARES value of 0 to value of n 
+1

В этом случае действительно необходимо место? –

+0

@NatashaDutta - Not _necessary_, но пробел в строке формата соответствует любому количеству пробелов, в том числе ни одного, на входе. В этом случае перед входом будет '\ n'. – ryyker

+0

да, но он все еще не работает, даже после того, как я переключился на цифру – Rockstar5645

1

Линия

scanf ("%lli", n); 

должно быть

scanf ("%lli", &n); 

Еще лучше проверьте возвращаемое значение функции, чтобы убедиться, что чтение ввода прошло успешно.

if (scanf("%lli", &n) != 1) 
{ 
    // Error in reading the input. 
    // Deal with the error 
} 
+0

Я не совсем понял эту последнюю часть. – Rockstar5645

+0

Если пользователь напечатал что-то, что не является числом, скажем 'l234' вместо' 1234', то вы сможете поймать ошибку и разобраться с ней. –

+0

@RSahu - Просто наблюдение: версия номера в вашем комментарии почти неотличима от числовой версии. Попробуйте использовать двойные кавычки вокруг цифр. «1234» – ryyker

1

Я думаю, вы должны переключиться на основе цифр, а не на м

 digit = m%10; 
    switch (m){ 

    case 0: 
      printf ("zero "); 
      break; 

должен быть

 digit = m%10; 
    switch (digit){ 

    case 0: 
      printf ("zero "); 
      break; 
+0

все еще не работает – Rockstar5645

0

Вы должны относиться входные данные как символы, а не цифры.

Вы также можете использовать массив для цифр текста:

const char number_as_text[] = "1234"; 
const char * digit_names[] = 
{ "zero", "one", "two", "three", "four", 
    "five", "six", "seven", "eight", "nine"}; 

const unsigned int length = strlen(number_as_text); 

for (unsigned int i = 0; i < length; ++i) 
{ 
    unsigned int digit_value = number_as_text[i] - '0'; 
    puts(digit_names[i]); 
    puts("\n"); 
} 

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

0

Реверсирование не удастся для больших чисел, обратный рисунок которого не соответствует long long. Вместо этого используйте рекурсию.

Различные усовершенствования, приведенные ниже.

#include <stdio.h> 

static void int_text_helper(long long neg_x) { 
    if (neg_x <= -10) { 
    int_text_helper(neg_x/10); 
    fputc(' ', stdout); 
    } 
    int digit = -(neg_x % 10); 
    static const char *text[] = { "zero", "one", "two", "three", "four", "five", 
     "six", "seven", "eight", "nine" }; 
    fputs(text[digit], stdout); 
} 

int main(void) { 
    long long int n; // m = 0, n, digit; 
    // printf("Whats your number? \n"); Typo 
    printf("What's your number? \n"); 
    // Note: this will read numbers likeand an octal number. 
    scanf("%lli", &n); 

    // Let us work with negative numbers instead so code can handle LLONG_MIN. 
    if (n < 0) { 
    fputs("negative ", stdout); 
    } else { 
    n = -n; 
    } 

    // Use do loop (or recursion), so no special case with 0 
    // if (n = 0) printf("zero "); 

    // Let us use recursion rather than reversing the number. 
    // Reverse fails for a number like 9223372036854775799 (Near LLONG_MAX) 
    int_text_helper(n); 

    return 0; 
} 

-9223372036854775808 
negative nine two two three three seven two zero three six eight five four seven seven five eight zero eight