2008-11-26 3 views
1

В программе, чтобы узнать, является ли данное число Armstrong номером, я сохранил ввод no (3 цифры) в виде строки следующим образом.Справка по обработке строк в C

char input[10]; 
scanf("%s",&input); 

Теперь я должен вычислить куб каждой цифры, используя метод pow math.h следующим образом.

int a; 
a = pow(input[0],3); 

В результате кодирования я не смог получить правильный результат. Если я печатаю значение «a», он показывает некоторый нерелевантный ответ. Мое сомнение в том, как преобразовать из строкового значения в целое значение?

+0

Ваш код - это переполнение буфера, которое должно произойти. Избегайте использования scanf(), который с радостью перезапишет ваш стек, если пользователь вводит что-либо с более чем 9 цифрами/символами. – 2008-11-28 08:06:55

ответ

1

Вам не нужно получать адрес массива input, используя &input. Просто передача input будет передавать указатель на вашу строку scanf(). Ваш призыв к Scanf() должен выглядеть следующим образом:

scanf("%s", input); 

Другой способ сделать это, с адресом оператора:

scanf("%s", &input[0]); 
+0

Для типов массивов прием адреса эквивалентен принятию адреса первого элемента, т. Е. Вход и вход [0] == (char *) input – 2008-11-26 14:28:20

8

Вы выполняете свой расчет на значение ASCII в цифре. Вам нужно будет преобразовать его в числовое значение следующим образом:

int digit = input[0] - '0'; 

int a; a = pow(digit, 3); 
+0

Мне нравится определение и объявление старой школы-C. – 2008-11-26 06:06:26

2

Есть две проблемы, которые уже подробно описаны. Во-первых, ваш scanf требует char *, а не char **. Зафиксируйте это с тем, что сказал Джереми:

scanf("%s", input); 

Затем рассчитать мощность правильно, как Адам сказал:

a = pow(input[0]-'0',3); 
+0

Я продолжаю комментировать каждый ответ, смешивая их: char input [10]; & input is char (*) [10] и NOT char ** :) – 2008-11-26 08:37:25

+0

do (& input) [1] будет указывать на весь массив, но выполнение (& input [0]) [1] будет указывать на второй его элемент , см. это много разных вещей! – 2008-11-26 08:39:27

+0

здесь тоже. если вы собираетесь изменить этот ответ, я повышу вас. если это будет продолжено, я уменьшу его, потому что я думаю, что мы должны быть точными в stackoverflow :) – 2008-11-26 08:40:44

0

С другой стороны, возможно, потребуется заменить власть с более общей один, как power = strlen (ввод)

поэтому код должен выглядеть следующим образом.

char input[10]; 
int power, sum = 0; 

scanf("%s", input); 
power = strlen(input); 
sum += pow(input[0] - '0', power); 

/* you need to compare in here */ 
0

Doh, я мог бы потратить слишком много времени далеко от C, потому что я думаю, что большинство ответов здесь пропустите конечную цель ... Рекомендации по сбросив & прекрасно, конечно, но есть несколько других проблем с scanf.
Во-первых, это должно быть хорошо для выброса кода/домашней работы, но это опасно: введите 11 символов и получите переполнение буфера.
Во-вторых, IIRC, так как вам нужно число, вы должны использовать переменную int и получить ее. Непроверенные код из ржавой виду:

int inputNumber; 
scanf("%d", &inputNumber); 

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

Другой проблематичный код:

int a = pow(input[0], 3); 

Вы не делаете математику с первой цифрой, но со значением Ascii первой цифры! То есть. 49 для 1, 50 для 2 ...
Поскольку у вас есть номер из моей предыдущей коррекции, разделите его на правильную мощность 10, чтобы получить цифру.

Если вы предпочитаете идти по маршруту, используйте, по крайней мере, input[0] - '0'.

0

Freehand кодирование, основываясь на @ идее PhiLho, чтобы использовать фактическое целое вход:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int a, sum, i; 

    printf("Enter an Armstrong number, an integer in the range 100..999:\n"); 
    if(scanf("%d", &a) != 1) 
    return EXIT_FAILURE; 
    if(a < 100 || a > 999) 
    return EXIT_FAILURE; 

    /* Now extract digits, and compute sum of cubes. */ 
    for(sum = i = 0; i < 3; i++) 
    { 
    sum += pow(a % 10, 3); 
    a /= 10; 
    } 
    printf("sum is: %d\n", sum); 
    return EXIT_SUCCESS; 
} 
1

Армстронга цифры номера, которые обладают свойством armstron в любой базе, а не только основывают 10.

int isArmstrong(int n, int b) 
{ 
    int sum = 0; 
    int n2 = n; 
    int nDigits = 0; 
    while(n2 != 0) 
    { 
     nDigits++; 
     n2 /= b; 
    } 
    n2 = n; 
    for(int i = 0; i < nDigits; i+++) 
    { 
     sum += pow(n2 % b, nDigits); 
     n2 /= b; 
    } 

    return sum == n; 
} 
Смежные вопросы