Помощь по обработке строк в C

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

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

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

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

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

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

Nathan Strong 28.11.2008 11:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
434
7

Ответы 7

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

scanf("%s", input);

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

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

Для типов массивов получение адреса эквивалентно взятию адреса первого элемента, то есть & input == & input [0] == (char *) input

Adam Rosenfield 26.11.2008 17:28

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

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

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

Мне нравится раздельное определение и объявление файла.

Stefan Mai 26.11.2008 09:06

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

scanf("%s", input);

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

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

Я продолжаю комментировать каждый ответ, смешивая их: char input [10]; & ввод - char () [10] и НЕ символ * :)

Johannes Schaub - litb 26.11.2008 11:37

выполнение (& input) [1] будет указывать за весь массив, но выполнение (& input [0]) [1] будет указывать на второй его элемент. видите, это много разных вещей!

Johannes Schaub - litb 26.11.2008 11:39

здесь тоже. если вы собираетесь изменить этот ответ, я за вас. если за него и дальше будут голосовать, я буду отрицать, потому что я думаю, что мы должны быть точными в stackoverflow :)

Johannes Schaub - litb 26.11.2008 11:40

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

Конечно, должен быть цикл вокруг строки «сумма + = ...».

Jonathan Leffler 26.11.2008 09:50

Дох, возможно, я провел слишком много времени вдали от 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'.

Кодирование от руки, основанное на идее @ 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;
}

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

Другие вопросы по теме