+ '0' не будет давать значение типа int - PullRequest
0 голосов
/ 05 марта 2020

Я пытался сделать эту программу int to char. + '0' в do в то время как l oop не преобразует значение int в ascii, тогда как + '0' в main конвертирует. Я перепробовал много утверждений, но он не работает в convert ().

#include<stdio.h>
#include<string.h>
void convert(int input,char s[]);
void reverse(char s[]);

int main()
{
        int input;
        char string[5];
        //prcharf("enter int\n");
        printf("enter int\n");
        scanf("%d",&input);
        convert(input,string);
        printf("Converted Input is : %s\n",string);
        int i=54;
        printf("%c\n",(i+'0')); //This give ascii char value of int
        printf("out\n");
}

void convert(int input,char s[])
{
        int sign,i=0;

        char d;
        if((sign=input)<0)
                input=-input;

        do
        {
                s[i++]='0'+input%10;//but this gives int only
        } while((input/=10)>0);

        if(sign<0)
                s[i++]='-';

        s[i]=EOF;
        reverse(s);
}

void reverse(char s[])
{
        int i,j;
        char temp;
        for(i=0,j=strlen(s)-1;i<j;i++,j--)
        {
                temp=s[i];
                s[i]=s[j];
                s[j]=temp;
        }
}

Снимок экрана вывода

Снимок кода

Ответы [ 2 ]

1 голос
/ 05 марта 2020

+ '0' в do, в то время как l oop не преобразует значение int в ascii

Ваш собственный скриншот показывает иначе (при условии ASCII на основе терминала).

Ваш код напечатан 56, поэтому он напечатал байты 0x35 и 0x36, поэтому string[0] и string[1] содержат 0x35 и 0x36 соответственно, а 0x35 и 0x36 являются кодировками ASCII 5 и 6 соответственно.

Это также можно проверить, напечатав элементы string по отдельности.

for (int i=0; string[i]; ++i)
   printf("%02X ", string[i]);

printf("\n");
1 голос
/ 05 марта 2020

Я попробовал вашу программу, и она работает по большей части. Я получаю несколько глупых выводов из-за этой строки:

s[i]=EOF;

EOF - это отрицательный целочисленный макрос, который представляет «Конец файла». Его фактическое значение определяется реализацией. Похоже, что на самом деле вам нужен нулевой терминатор:

s[i]='\0';

, который удалит любые глупые символы в выводе.

Я бы также сделал эту строку в main немного больше. Нет причин, по которым мы не могли бы использовать что-то вроде

char string[12];

Я бы использовал минимум 12, который покроет вас 32-битным INT_MAX со знаком.

РЕДАКТИРОВАТЬ

Похоже (основываясь на всех комментариях), что вы на самом деле пытаетесь создать программу, которая просто выводит символы с использованием числовых значений c ascii. На самом деле convert функция преобразует целое число в строковое представление этого целого числа. Например:

int num = 123;            /* Integer input */
char str_num[12] = "123"; /* char array output */

convert - это, в основном, ручная реализация itoa.

Если вы пытаетесь просто выводить символы с заданными кодами ascii, это много более простая программа. Во-первых, вы должны понимать, что этот код здесь является неверной интерпретацией того, что convert пытался сделать:

int i=54;
printf("%c\n",(i+'0'));

Точка добавления '0' ранее заключалась в преобразовании одного ди git целые числа для их версии кода ASCII. Для справки используйте это: asciitable . Например, если вы хотите преобразовать целое число 4 в символ '4', вы должны добавить 4 к '0', который является кодом 48 ASCII, чтобы получить 52. 52 является кодом ASCII для символа '4'. Чтобы распечатать символ, который представлен кодом ASCII, решение гораздо проще. Как уже отмечалось в комментариях, char по сути уже является числительным c. Это даст вам желаемое поведение:

int i = 102    /* The actual ascii value of 'f' */
printf("%c\n", i);

Это будет работать, но для безопасности следует привести к типу char. То, является ли это избыточным, может быть определено реализацией. Я действительно считаю, что отправка неправильных типов в printf - неопределенное поведение, работает ли оно в этом случае или нет. Безопасная версия:

printf("%c\n", (char) i);

Таким образом, вы можете написать всю программу в main, так как нет необходимости в функции convert:

int main()
{
        /* Make initialization a habit */
        int input = 0;  

        /* Loop through until we get a value between 0-127 */
        do {
                printf("enter int\n");
                scanf("%d",&input);
        } while (input < 0 || input > 127);

        printf("Converted Input is : %c\n", (char)input);
}

Мы ничего не хотим вне 0-127. char имеет диапазон 256 битов (AKA за байт!) И охватывает диапазон от -127 до 127. Если вы хотите буквальную интерпретацию старших символов, вы можете использовать unsigned char (0-255). Это нежелательно для терминала linux, который, вероятно, ожидает символы UTF-8. Значения выше 127 будут представлять части многобайтовых символов. Если вы хотите поддержать это, вам понадобится char[], и код станет намного более сложным.

...