strcat
обрабатывает свой аргумент как указатель на строку с нулевым символом в конце.Приведение char
к char *
просто опасно, и я не могу представить себе причин, по которым оно когда-либо будет полезным (не говоря уже о том, что вы глупы, когда пытаетесь это сделать - все делают глупые ошибки, когда учатся. Вот почему мы 'здесь.)
Причина в том, что он будет интерпретировать один байт char
плюс дополнительные sizeof(char*) - sizeof(char)
(обычно 3) байта, окружающие этот char
, как указатель, на который будет указывать... в любом месте.У вас нет возможности узнать, куда он указывает, поскольку 3 из этих байтов находятся вне вашего контроля, и, следовательно, нет способа узнать, указывает ли он на действительные данные.
Вы можете принять это как второй подход:
strcat(inp, &c);
На этот раз вам будет лучше, так как &c
является выражением типа char *
, и приведение не требуется.Но опять же, strcat
предполагает, что его аргумент является строкой с нулевым символом в конце, и, поскольку у вас нет способа гарантировать нулевой байт после данных char
, это не сработает.
Лучший способ - этоэто:
size_t len = strlen(inp); // this may already be calculated somewhere else
...
inp[len++] = c; // add c as the last character, and adjust our len
inp[len] = '\0'; // add a new nul terminator to our string
ОБНОВЛЕНИЕ:
На самом деле я солгал. best - это использовать стандартную библиотечную функцию fgets
, которая, кажется, выполняет более или менее то, что вы пытаетесь сделать.Честно говоря, я забыл об этом, но если это домашнее задание, ваш профессор может не захотеть, чтобы вы использовали fgets
, чтобы вы могли научиться делать это вручную.Однако, если это не домашняя работа, fgets
делает именно то, что вы ищете.(На самом деле, третий подход хорошо подходит для реализации функций, подобных fgets
или fgets
.)
Я бы также добавил несколько других комментариев к вашей функции input
:
char* inp = "";
будет указывать на данные только для чтения.Недостаток в стандарте C (для обратной совместимости) позволяет присваивать строковые литералы типам char*
вместо типов const char *
, как это должно быть (IMHO).
Есть несколько способов приблизиться к этому, но лучшим является динамическое распределение.Используйте функцию malloc
, чтобы зарезервировать некоторые данные, отследите, сколько вы использовали в своей функции, и используйте функцию realloc
, если вам понадобится больше места для ее хранения.Если вам нужна помощь с этим, я уверен, что вы вернетесь сюда (надеюсь, не слишком в ближайшее время) с другим вопросом.:) getchar()
возвращает int
, поскольку EOF
определено как выход за пределы нормального диапазона char
.Чтобы различать любые char
и EOF
, лучше всего сделать c
и int
.В противном случае совершенно правильный символ может сигнализировать EOF
.Обязательно приведите c
к char
при добавлении его в строку.