Помощь по обработке строк в C - PullRequest
1 голос
/ 26 ноября 2008

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

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

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

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

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

Ответы [ 7 ]

8 голосов
/ 26 ноября 2008

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

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

int a; a = pow(digit, 3);
2 голосов
/ 26 ноября 2008

Есть две проблемы, обе уже подробно описаны. Во-первых, вашему scanf нужен символ *, а не символ **. Исправьте это словами Джереми:

scanf("%s", input);

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

a = pow(input[0]-'0',3);
1 голос
/ 26 ноября 2008

числа Армстронга - это числа, которые показывают свойство Армстрона в любой заданной базе, а не только в базе 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;
}
1 голос
/ 26 ноября 2008

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

scanf("%s", input);

Еще один способ сделать это с адресом оператора:

scanf("%s", &input[0]);
0 голосов
/ 26 ноября 2008

Ручное кодирование, основанное на идее @ 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;
}
0 голосов
/ 26 ноября 2008

Дох, я мог бы потратить слишком много времени далеко от C, потому что я думаю, что большинство ответов здесь не достигают конечной цели ... Конечно, совет по удалению & отлично, но есть несколько других сканф.
Во-первых, для выбрасывания кода / домашнего задания все должно быть в порядке, но это опасно: наберите 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 голосов
/ 26 ноября 2008

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

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

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 */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...