Отпечатки строк после границ - PullRequest
0 голосов
/ 19 января 2019

Я печатал символ из строки и пытался, если смогу напечатать нулевой символ strlen(str). Но символ до того, как ноль был напечатан.

Затем я попытался напечатать strlen(str)+1, он все еще печатает символ до нуля.

Тогда

Индекс в значительной степени превышает предел, 1010101 -> Ошибка сегментации, как и ожидалось.

MAX -> 100 -> char перед '\ 0'

MAX + 1 -> 101 -> символ перед '\ 0'

МАКС + 5 -> 105 -> мусор

МАКС + 2, МАКС + 3, МАКС + 4 -> символ до '\ 0'

#include<stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
    char str[101];
    scanf("%[^\n]",str);
    str[strlen(str)]='\0';
    printf("%c",str[105]);
}

Ввод condn, 1 =

Ввод:

How are you?

Символьная переменная -> Печатный символ

str [strlen (str) -1] ->?

str [strlen (str)] ->?

str [strlen (str) +1] ->?

стр [100] ->?

стр [101] ... стр [104] ->?

str [105] -> значение мусора, которое меняется каждый раз

Теперь мой вопрос изменился с того, почему нулевой символ не печатается, на почему почему печатается символ перед нулем? Даже за пределы ценностей ??????

Edit:
printf ("% s", str [strlen (str)]) возвращает -> (ноль)

Меньше, чем дает segmentation fault и больше, чем дает (null)

1 Ответ

0 голосов
/ 19 января 2019

Как уже говорилось в других комментариях, это неопределенное поведение.Однако возможно, что ваша программа фактически читает и печатает символ 104 байта после начала вашей строки, и ваша терминальная программа не знает, как напечатать этот символ, так что в результате вы получите ? в выводе.

Что меня больше всего беспокоит, так это ваше редактирование, printf("%s", str[strlen(str)]).Передача %s в printf означает, что вы хотите, чтобы он принял этот аргумент в качестве указателя и разыменовал его.Однако str[strlen(str)] возвращает символ, а не указатель на символ.Таким образом, вы в конечном итоге либо передаете ноль, который printf услужливо печатает (null) for, либо число от 1 до 255, которое не является допустимым указателем и приведет к ошибке сегментации, которую вы видите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...