jack
jack

Reputation: 1

Add up digit from char array in c language

I am new to C programming and trying to make a program to add up the digits from the input like this:

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

I try to convert the char index to int but it dosent seems to work! Can anyone help?

Here's my code:

#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);
   }
}

Output:

nilai: 12345
4950515253

Upvotes: 0

Views: 978

Answers (3)

Vlad from Moscow
Vlad from Moscow

Reputation: 310950

For starters according to the C Standard the function main without parameters shall be declared like

int main( void )

This character array

char nilai[5];

can not contain a string with 5 digits. Declare the array with at least one more character to store the terminating zero of a string.

char nilai[6];

In the call of scanf

scanf("%s",&nilai);

remove the operator & before the name nilai. And such a call is unsafe. You could use for example the standard function fgets.

This call

length = strlen(nilai);

is redundant and moreover the variable length should be declared having the type size_t.

This loop

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

entirely does not make sense.

The program can look the following way

#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;
}

Its output might look like

nilai: 12345
15

Upvotes: 0

Some programmer dude
Some programmer dude

Reputation: 409166

You have two problems with the code you show.

First lets talk about the problem you ask about... You display the encoded character value. All characters in C are encoded in one way or another. The most common encoding scheme is called ASCII where the digits are encoded with '0' starting at 48 up to '9' at 57.

Using this knowledge it should be quite easy to figure out a way to convert a digit character to the integer value of the digit: Subtract the character '0'. As in

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

Now for the second problem: Strings in C are really called null-terminated byte strings. That null-terminated bit is quite important, and all strings functions (like strlen) will look for that to know when the string ends.

When you input five character for the scanf call, the scanf function will write the null-terminator on the sixth position in the five-element array. That is out of bounds and leads to undefined behavior.

You can solve this by either making the array longer, or by telling scanf not to write more characters into the array than it can actually fit:

scanf("%4s", nilai);  // Read at most four characters
                      // which will fit with the terminator in a five-element array

Upvotes: 3

Blaze
Blaze

Reputation: 16876

First of all, your buffer isn't big enough. String input is null-terminated, so if you want to read in your output 12345 of 5 numbers, you need a buffer of at least 6 chars:

char nilai[6];

And if your input is bigger than 5 chars, then your buffer has to be bigger, too.

But the problem with adding up the digits is that you're not actually adding up anything. You're just assigning to int nilai1 over and over and discarding the result. Instead, put int nilai1 before the loop and increase it in the loop. Also, to convert from a char to the int it represents, subtract '0'. All in all this part should look like this:

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

Upvotes: 0

Related Questions