замена целых чисел на строки в C - PullRequest
0 голосов
/ 11 мая 2018

Я написал код, который заменяет целые числа от 0 до 3 на strings.Мне было разрешено использовать только getchar() и putchar().Если input равно 1, выходной результат станет "one".

#include <stdio.h>

int main()
{
    int c;            
    char* arr[4] = {"zero", "one", "two","three"};
    int i;

        while ((c = getchar ()) != EOF) 
        {
            if(c==0+'0') {
                char* str = arr[0];
                for (i = 0; str[i] != '\0'; i++) {
                    putchar(str[i]);
                }
            }
            else if(c==1+'0') {
                char* str = arr[1];
                for (i= 0; str[i] != '\0';i++) {
                    putchar(str[i]);
                }
            }
            else if(c==2+'0') {
                char* str = arr[2];
                for (i = 0; str[i] != '\0'; i++) {
                    putchar(str[i]);
                }
            }
            else if(c==3+'0') {
                char* str = arr[3];
                for (i = 0; str[i] != '\0'; i++) {
                    putchar(str[i]);
                }   
            }
            else
                putchar(c);
   }

return 0;
}

code довольно длинный.Есть ли более короткий способ написать это?

Если я введу 33, вывод будет "threethree".Может ли кто-нибудь дать мне предложения, как я могу изменить свой код, чтобы не делать этого?

примечание: мне также не разрешено использовать функции.

Ответы [ 4 ]

0 голосов
/ 11 мая 2018

Вот простой подход к той же задаче. Я попытался объяснить логику в комментариях.

int main(void) {
        char *arr[11] = {"zero", "one", "two","three","four","five","six","seven","eight","Nine","Ten"};
        int *input = malloc(sizeof(*input))/*1st time 4 byte */ , row = 1;
        while( (input[row-1] = getchar())!=EOF ) {

                if(input[row-1]==10) /* if ENTER key is presed */
                        break;
                input[row-1] = input[row-1] - 48;/* convert it */
                printf("%s ",arr[ input[row-1]%10 ]);/* its simple, just think on it */
                row++;
                input = realloc(input,row * sizeof(*input));/* reallocate based on number of input */
        }
        /* free dynamically allocated memory @TODO*/
        return 0;
}

Я только что дал подсказку, сделайте его общим, как напишите условие, если ввод меньше нуля и т. Д. Надеюсь, это поможет.

0 голосов
/ 11 мая 2018

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

#include <stdio.h>

int main()
{
    int c;
    char* arr[4] = {"zero", "one", "two","three"};
    int i;
    char last_input = '9';

    while ((c = getchar ()) != EOF)
    {
        if(c != last_input && '0' <= c  && c <= '3') {
            last_input = c;
            int index = c - '0';
            char* str = arr[index];
            for (i = 0; str[i] != '\0'; i++) {
                putchar(str[i]);
            }
        }
        else{
            putchar(c);
        }

    }
    return 0;
}
0 голосов
/ 11 мая 2018

Вот мой код, использующий цикл для сокращения вашего кода.

#include <stdio.h>

int main()
{
    int c;            
    char* arr[4] = {"zero", "one", "two","three"};
    int i, j;

    while ((c = getchar ()) != EOF) 
    {
        for(j = 0; j < 4; j++)
        {
            if(c == j + '0')
            {
                char* str = arr[j];
                for (i = 0; str[i] != '\0'; i++)
                {
                    putchar(str[i]);
                }
                j = 10; // just to detect processed character
                break;
            }
        }
        if(j != 10)
        {
            putchar(c);
        }
    }
    return 0;
}
0 голосов
/ 11 мая 2018

Вы можете сжать свои операторы if, используя одно условие if, как это:

#include <stdio.h>

int main()
{
    int c;            
    char* arr[4] = {"zero", "one", "two","three"};
    int i;

    while ((c = getchar ()) != EOF) {
    int k = c-'0';
        if(k>=0 && k<=3) {
            char* str = arr[k];
            for (i= 0; str[i] != '\0';i++) {
                putchar(str[i]);
            }
        }
        else {
            putchar(c);
        }
    }
return 0;
}
...