Я хочу добавить числовой формат строки типа данных - PullRequest
1 голос
/ 29 мая 2019

У меня есть следующий ввод в виде строки:

Num: 12345

Я хотел бы распечатать сумму цифр с входа (1 + 2 + 3 + 4 + 5 = 15):

total:15

Я пытался, но есть проблема с atoi() в цикле for, и я получил ошибку:

[Ошибка] неверное преобразование из 'char' в 'const char *'

Как я могу это исправить или как я могу решить это проще?

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

 char numstr[100];
 int total = 0;

 main(){
     printf("Num:");
     scanf("%s", numstr);

     for(int i = 0; i < strlen(numstr); i++){
         total += atoi(numstr[i]);
     }
     printf("%d", total);
 }

Ответы [ 5 ]

2 голосов
/ 29 мая 2019

Вы можете вычесть числовой символ (в ASCII) на 0x30 (т. Е. Нулевой символ ASCII '0'), чтобы преобразовать числовой символ ASCII в его десятичный эквивалент.

 #include <stdio.h>
 #include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
 char numstr[100];
 int total=0;
 main(){
 printf("Num:");
 scanf("%s",numstr);

 for(int i = 0;i<strlen(numstr);i++){
     total += numstr[i] - 0x30;
 }
 printf("%d",total);
 }

Строка "12345" будетбыть

1 -> 0x31 - 0x30 = 1
2 -> 0x32 - 0x30 = 2
3 -> 0x33 - 0x30 = 3
4 -> 0x34 - 0x30 = 4
5 -> 0x35 - 0x30 = 5
1 голос
/ 29 мая 2019

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

total += numstr[i] - '0';

Это потому, что символ 0 имеет значение, равное 48 в десятичном (или 0x30 в шестнадцатеричном), символ 1 равен 49 в десятичном, 2 с 50 и и так далее.

Вычитание символа 0 из себя приводит к 0 (десятичное число). Вычитание символа 0 из символа 1 приводит к 1 (десятичному) и т. Д.

0 голосов
/ 29 мая 2019

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

total += atoi(numstr[i]);

на

total += numstr[i] - '0';

Возможно, вы захотите сначала проверить, верно ли isdigit (numstr [i]),для проверки ошибок.

0 голосов
/ 29 мая 2019

Simple!Возьмите ввод как строку и вычтите символ на «0».Это даст вам номер в этой конкретной позиции.См. Мой код ниже:

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
char numstr[100];
int total=0;
main(){
printf("Num:");
scanf("%s",numstr);

for(int i = 0;i<strlen(numstr);i++){
 total += (numstr[i]-'0');
}
printf("%d",total);
}

Сохраняет необходимость использования atoi () или других функций.

0 голосов
/ 29 мая 2019

atoi() не делает то, что вы думаете, делает.

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

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


 int main(void){                     //correct signature

     int total=0;                    // no need to be global
     char numstr[100] = {0};         // same
     int ret = -1;

     printf("Num:");
     ret = scanf("%99s",numstr);       
     if (ret != 1){                    // basic sanity check for scanf
         printf("Error in scanning\n");
         exit (-1);
     }

     long int converted = strtol(numstr, NULL, 10);   // convert to integer
     printf("%ld\n\n", converted);

     for (int i = 0; converted; i++){

         total += converted %10;                // add the digit
         converted /= 10;                       // reduce the last added digit
     }

     printf("%d",total);
     return 0;                               // return 0 is implicit for `main()`, anyways
 }
...