Я попробовал вашу программу, и она работает по большей части. Я получаю несколько глупых выводов из-за этой строки:
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[]
, и код станет намного более сложным.