Search code examples
cletters-and-numbers

Converting struct numbers into letters in C?


I want to read 15 numbers then convert them into letters, something like: 1 = A, 2 = B, 3 = C, 4 = D... I have this structure here:

struct Num {    
    int number;
    char letter;
};

struct Num num[150];

and this to read the numbers:

void read_num() {
    int i;
    for (i = 0; i < 15; i++) {
        printf("Insert number\n");
        scanf("%d", &num[i].number);
        fflush(stdin); 
    }
}

and now I need something to convert each number into a letter, I did create a huge function with twenty five if but it doesn't seem to work. BTW I only need to go to the number 25 so its A to Y in the alphabet. The function that doesn't work is this:

void convert() {    
    int i, ii;
    for (i = 0; i < 15; i++) {
        if (num[i].number = 1){
            num[i].letter = "A";
        } else
        if (num[i].number = 2) {
            num[i].letter = "B";
        } else
        if (num[i].number = 3) {
            num[i].letter = "C";
        } else
        if (num[i].number = 4) {
            num[i].letter = "D";
        } else
        if (num[i].number = 5) {
            num[i].letter = "E";
        ...
        }
    }
}

Im using Dev C++ in windows and C programming, I know this is a noob question but help please!


Solution

  • 1) Don't ever use fflush(stdin), it's undefined behavior = the worst thing that can happen to you in C programming.

    2) Use == for comparison, like so: if (num[i].number == 5).

    3) "a" is a string literal of type const char[2]. You want a char, which is enclosed in single quotes: 'a'.

    With that said, in pretty much every encoding used today, letters are arranged in lexicographic order, so you can just do num[i].letter = (char)(num[i].number + 'A' - 1), so long as you're sure num[i].number is in the range you want. If not, you will need conditionals, but it would be better style to use a switch construct, like so:

    switch (num[i].number)
    {
        case 1:
            num[i].letter = 'A';
        break;
    
        ...
    }
    

    And by the way, please don't use Dev-C++, it's outdated and no longer maintained. You can either use Code::Blocks if you want to stay with MinGW, or you could use one of the community editions of Visual C++, which are free (and can also be used to compile C code).