Отредактированный вопрос
я понял свою ошибку в коде, я дал в оригинальный вопрос, а персонажи я получаю мусорные символы. Хотя, у меня есть еще несколько вопросов о мусорных символов в C:Мусорные символов в C
Есть ли у мусора персонажи какой-то узор? Это означает, что вы можете предсказать для пустой строки, какой может быть персонаж, для пустого целого, что придет, и так далее.
Когда объявляется переменная, почему у нее есть символ мусора, а не пустой? Есть ли конкретная причина хранить его с мусором?
Для строки, которая не заканчивается на нуль, будет ли отображаться тот же символ мусора на каждой ОС? Если да, то какой?
Есть ли одинаковые символы мусора на каждой ОС? Или они разные?
Есть ли способ распечатать эти символы в буфере
stdout
в C/C++?Если вы внимательно посмотрите на символ , в нем есть символы и цифры. Они что-то представляют?
Есть ли список символов мусора, которые могут быть напечатаны на C/C++?
Оригинал Вопрос
Название оригинального вопроса: Таинственная выводимый символ в C
Я пришел через этот код в K & R:
int scanline (char str [], int lim) /* Line will be read in 'str []', while lim is the maximum characters to be read */
{
int c, len, j; /* 'len' will have the length of the read string */
j = 0; /* Initializing 'j' */
for (len = 0; (c = getchar()) != EOF && c != '\n'; ++len) /* Reading a character one by one, till the user enters '\n', and checking for failure of 'getchar' */
{
if (len < (lim -2)) /* Checking that string entered has not gone beyond it's boundaries. '-2' for '\n' and '\0' */
{
str [j] = c; /* Copying read character into 'string [j]' */
++ j; /* Incrementing 'j' by 1 */
}
}
if (c == '\n') /* Checking if user has finished inputting the line */
{
str [j] = c; /* Copying newline into string */
++j;
++ len;
}
return len; /* Returning number of characters read */
}
В K & R, он известен как getline
, но я внес изменения, добавили комментарии, и, таким образом, как это определено scanline
. Чтобы проверить это, я сделал демонстрационную программу:
#include <mocl/cancel.h>
int main (int argc, char **argv)
{
int len;
char str [50];
len = scanline (str, 50);
printf ("len = %d\n str = %s\n", len, str);
return 0;
}
необходимые заголовки и функция была в моей библиотеке, cancel.h
. Затем, когда я скомпилировал свою программу, она прошла успешно. Хотя, когда я запустил исполняемый файл, я получил неожиданный выход (я не могу ввести его, как я получить символ, который, когда я копирую, он просто получает вставленный как «м»):
Таинственный персонаж который при копировании копируется как письмо m
.Кроме того, при запуске программы с разными входами, я получаю различные загадочные выходы:
В другом случае я получить идеальный выход, просто пустая строка печатается:
Я также встретил вопрос this, в котором пользователь получает тот же символ.
Что я сделал до сих пор?
Я искал много, и я не мог найти любой ключу о этого символа, но если вы видите тщательно, на втором изображении, я получаю больше символов, когда я вхожу «привет это Ashish». Один из них - косая черта, а один - . Но я получаю еще одного персонажа . Я получил ссылку this, в которой было показано, как ее воспроизвести, и объяснил это, хотя я не мог понять. Когда вы запускаете код, указанный здесь, вы получаете много символов, а один из них - . Хотя даже автор этой статьи не мог ее скопировать и не опубликовал. Так вот вывод:
Это был фактический объем производства, так как это не ясно, вот вырезают версия:
Поэтому в основном я должен знать, что и персонажи и - это расширенные символы из строки. В этот момент я действительно выяснил, что вызвало проблему в scanline
.
Линии
if (c == '\n') /* Checking if user has finished inputting the line */
{
str [j] = c; /* Copying newline into string */
++j;
++ len;
}
были причиной проблемы, как вы копировали новую строку в строку. Это сработало, но я не уверен, почему, поскольку это было всего лишь догадкой. Я искал, но все еще не мог найти причину.
Мои вопросы
Как удаление этих строк сделать работу программы правильно?
Каковы символы и ? Что они должны делать и как они появились здесь?
Есть ли еще такие символы?
Почему эти символы не могут быть скопированы?
Это Неопределенное поведение?
'str' не имеет значения null-terminate. – BLUEPIXY
Может ли пояснитель объяснить? Я бы хотел улучшить свой пост. –
Некоторые наборы инструментов сделают DEBUG строит и заполняет память, которая в противном случае не была бы заполнена (потому что ваш код не говорит), так что вы и его библиотеки отладки можете легко поймать _some_ ошибки при тестировании _some_ путей выполнения. –