Добавить цифру из массива символов на языке c - PullRequest
0 голосов
/ 28 октября 2019

Я новичок в C программировании и пытаюсь создать программу для сложения цифр из ввода следующим образом:

input = 12345 <= 5 digit
output = 15 <= add up digit

Я пытаюсь преобразовать индекс char в intно это, похоже, работает! Кто-нибудь может помочь?

Вот мой код:

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

int main(){
   char nilai[5];
   int j,length,nilai_asli=0,i;
   printf("nilai: ");
   scanf("%s",&nilai);
   length = strlen(nilai);

   for(i=0; i<length; i++){
        int nilai1 = nilai[i];
        printf("%d",nilai1);
   }
}

Вывод:

nilai: 12345
4950515253

Ответы [ 3 ]

3 голосов
/ 28 октября 2019

У вас две проблемы с кодом, который вы показываете.

Сначала давайте поговорим о проблеме, о которой вы спрашиваете ... Вы отображаете значение закодированного символа. Все символы в C кодируются так или иначе. Наиболее распространенная схема кодирования называется ASCII , где цифры кодируются с '0', начиная с 48 до '9' с 57.

Используя эти знания, это должно бытьДовольно легко найти способ преобразования цифр в целочисленные значения: вычтите символ '0'. Как и в

int nilai1 = nilai[i] - '0';  // "Convert" digit character to its integer value

Теперь для второй проблемы: строки в C на самом деле называются завершенными нулями байтовыми строками . Этот бит с нулевым символом в конце весьма важен, и все строковые функции (например, strlen) будут искать его, чтобы узнать, когда заканчивается строка.

Когда вы вводите пять символов для *При вызове 1027 * функция scanf запишет нулевой терминатор в шестую позицию в массиве из пяти элементов. То есть выходит за границы и приводит к неопределенному поведению .

Вы можете решить эту проблему, либо увеличив массив, либо сказав scanf не писать большесимволов в массиве, чем он может уместиться:

scanf("%4s", nilai);  // Read at most four characters
                      // which will fit with the terminator in a five-element array
0 голосов
/ 28 октября 2019

Для начинающих согласно стандарту C функция main без параметров должна быть объявлена ​​как

int main( void )

Этот массив символов

char nilai[5];

не может содержать строку из 5 цифр. Объявите массив не менее чем с одним символом для хранения конечного нуля строки.

char nilai[6];

При вызове scanf

scanf("%s",&nilai);

удалите оператор & перед именемnilai. И такой звонок небезопасен. Например, вы можете использовать стандартную функцию fgets.

. Этот вызов

length = strlen(nilai);

является избыточным, и более того, переменная length должна быть объявлена ​​с типом size_t. * 1023. *

Этот цикл

   for(i=0; i<length; i++){
        int nilai1 = nilai[i];
        printf("%d",nilai1);
   }

полностью не имеет смысла.

Программа может выглядеть следующим образом

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

int main(void) 
{
    enum { N = 6 };
    char nilai[N];

    printf( "nilai: ");
    fgets( nilai, sizeof( nilai ), stdin );

    int nilai1 = 0;

    for ( const char *p = nilai; *p != '\0'; ++p )
    {
        if ( isdigit( ( unsigned char ) *p ) ) nilai1 += *p - '0';  
    }

    printf( "%d\n", nilai1 );

    return 0;
}

Ее вывод может выглядеть как

nilai: 12345
15
0 голосов
/ 28 октября 2019

Прежде всего, ваш буфер недостаточно велик. Строковый ввод завершается нулем, поэтому, если вы хотите прочитать на выходе 12345 из 5 чисел, вам нужен буфер, по крайней мере, 6 символов:

char nilai[6];

И если ваш вводбольше чем 5 символов, то ваш буфер тоже должен быть больше.

Но проблема с добавлением цифр в том, что вы на самом деле ничего не добавляете. Вы просто присваиваете int nilai1 снова и снова и отбрасываете результат. Вместо этого поместите int nilai1 перед циклом и увеличьте его в цикле. Кроме того, для преобразования из char в int, который он представляет, вычтите '0'. В целом эта часть должна выглядеть так:

int nilai1 = 0;
for (i = 0; i < length; i++) {
    nilai1 += nilai[i] - '0';
}
printf("%d\n", nilai1);
...