I want to merge two single character constants into one like '1'+'2'='12'.So that I can add an integer value to this single character. I have tried a lot of things like used their ASCII values.Also the substring functions doesn't seem to work in this context.Help!
- 
                    1It would be good to show us your effort so far. but something like `char arr[3] = {0}, arr[0] = '1', arr[1] = '2', arr[2] = 0;` But this is now string. – unalignedmemoryaccess Aug 12 '17 at 07:49
- 
                    1`12` isn't a character though... – cs95 Aug 12 '17 at 07:49
4 Answers
If you want to compute the number from 2 digit characters, the formula is very simple:
char c1 = '1';
char c2 = '2';
int value = (c1 - '0') * 10 + (c2 - '0');  // value is 12
c1 - '0' evaluates to the number represented by the digit c1. It works because the digits are guaranteed to be consecutive from '0' to '9' in the execution character set.
 
    
    - 131,814
- 10
- 121
- 189
There are more 'beautiful' ways to do it, but this ought to be enough for a first attempt.
int value = 0;
if (firstcharacter == '1') value = 10;
if (firstcharacter == '2') value = 20;
/* ... */
if (firstcharacter == '9') value = 90;
if (secondcharacter == '1') value += 1;
/* ... */
if (secondcharacter == '9') value += 9;
printf("value + 42 is %d.\n", value + 42);
 
    
    - 106,608
- 13
- 126
- 198
- 
                    Your way is waay not that beautiful. Check this: `if (fc >= '1' && fc <= '9') value = 10 * (fc - '0');` And then, `if (sc >= '1' && sc <= '9') value += sc - '0'`. `fc` means `first character`, `sc` means `second character`. – unalignedmemoryaccess Aug 12 '17 at 08:06
- 
                    
If the goal is to combine two chars which are digits to form an integer value that can be used in arithmetic expressions, then a compound literal can be used to form a string from the chars, and strtol() can be used to convert the string to an integer value. Here is an example that uses the function char_digits_int() to convert a pair of char inputs into an int value. If either of the arguments is not a digit, -1 is returned:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
int char_digits_int(char x, char y);
int main(void)
{
    char a = '1';
    char b = '2';
    printf("%c and %c form: %d\n", a, b, char_digits_int(a, b));
    printf("The sum of %c%c and 1 is: %d\n",
           a, b, char_digits_int(a, b) + 1);
    int value = char_digits_int('0', 'x');
    if (value == -1) {
        fprintf(stderr, "Non-digit input\n");
    } else {
        printf("Value: %d\n", value);
    }
    return 0;
}
/* Returns -1 if x or y is not a digit */
int char_digits_int(char x, char y)
{
    int val = -1;
    if (isdigit((unsigned char) x) && isdigit((unsigned char) y)) {
        val = strtol((char []) { x, y, '\0' }, NULL, 10);
    }
    return val;
}
Program output:
1 and 2 form: 12
The sum of 12 and 1 is: 13
Non-digit input
 
    
    - 19,498
- 5
- 37
- 60
- 
                    for 2 characters ? Anonymous compound literals? The OP asked the **elementary** question, give him answer he will understand. He definitely is the beginer – 0___________ Aug 12 '17 at 08:29
- 
                    1@PeterJ-- compound literals are a fundamental feature of the language that everyone should know about. If OP doesn't know about them yet, now is a good time to learn. – ad absurdum Aug 12 '17 at 08:31
- 
                    If you ask 20 people claiming they know C I bet 10 never heard about them :). And another 7 will struggle to write a correct one without the access to internet. – 0___________ Aug 12 '17 at 08:34
- 
                    1I am right - see the answer chosen - the one OP actually understands – 0___________ Aug 12 '17 at 08:36
If your goal is to combine the character constants '1' and '2' to get the value of the multi-character character constant '12', the answer is There is no portable way to do this and you should probably not write code that uses these things anyway.
Look at this answer for a historical perspective on this oddity: https://stackoverflow.com/a/45576458/4593267
It you are still curious (good for you), here is a test case:
#include <limits.h>
#include <stdio.h>
int main(void) {
    if ((('1' << CHAR_BIT) | '2') == '12')
        printf("(('1' << CHAR_BIT) | '2') == '12'\n");
    else
    if ((('2' << CHAR_BIT) | '1') == '12')
        printf("(('2' << CHAR_BIT) | '1') == '12'\n");
    else
        printf("No simple way to get '12' from '1' and '2'\n");
    return 0;
}
On my system, I get these warnings:
multichar.c:5:38: warning: multi-character character constant [-Wmultichar]
    if ((('1' << CHAR_BIT) | '2') == '12')
                                     ^
multichar.c:8:38: warning: multi-character character constant [-Wmultichar]
    if ((('2' << CHAR_BIT) | '1') == '12')
                                     ^
multichar.c:8:11: warning: code will never be executed [-Wunreachable-code]
    if ((('2' << CHAR_BIT) | '1') == '12')
          ^~~
multichar.c:9:9: warning: code will never be executed [-Wunreachable-code]
        printf("(('2' << CHAR_BIT) | '1') == '12'\n");
        ^~~~~~
4 warnings generated.
And this output:
(('1' << CHAR_BIT) | '2') == '12'
But other systems, notably big endian ones, may produce a different output.
 
    
    - 131,814
- 10
- 121
- 189
- 
                    Interesting link; is endianness the only implementation-defined aspect of multi-character constants? Also, on a pedantic note, isn't it possible for a character constant, e.g., `'1'`, to have a negative value, leading to UB with left bit-shifts? – ad absurdum Aug 12 '17 at 09:03
- 
                    @DavidBowling: Endianness is the main aspect, but the Standard allows for other implementation-defined choices. Regarding the negative characters, the Standard does mandate that the digits and letters have positive values as confirmed by the responses to this question: https://stackoverflow.com/questions/45123003/do-a-and-0-always-have-positive-values-even-if-char-is-signed – chqrlie Aug 12 '17 at 12:01
- 
                    Thanks for that link; I had forgotten about the caveat for members of the basic execution character set.... – ad absurdum Aug 12 '17 at 12:09
