字符串在边界后打印

时间:2019-01-19 05:06:15

标签: c arrays string

我正在从字符串中打印出char,然后尝试是否可以打印空字符strlen(str)。但是,打印出null之前的字符。

然后,我尝试打印strlen(str)+1,它仍然在null前打印字符。

然后

索引大大超出界限1010101->分段错误,符合预期。

MAX-> 100->'\ 0'之前的字符

MAX + 1-> 101->'\ 0'之前的字符

MAX + 5-> 105->垃圾

MAX + 2,MAX + 3,MAX + 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]);
}

输入内容为, 1 =

输入:

How are you?

字符var->字符已打印

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

str [strlen(str)]->吗?

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

str [100]->?

str [101] ... str [104]->吗?

str [105]->每次更改的垃圾值

现在,我的问题从为什么不打印null字符改为为什么打印null之前的char?即使对于超出范围的值??????

编辑:
printf(“%s”,str [strlen(str)])返回->(空)

少于给定segmentation fault并大于给定(null)

1 个答案:

答案 0 :(得分:2)

正如其他评论所说,这是未定义的行为。但是,您的程序有可能实际上是在字符串开头之后读取并打印了104个字节的字符,并且您的终端程序不知道如何打印该字符,因此最终在输出中出现?

让我更担心的是您的编辑printf("%s", str[strlen(str)])。将%s传递给printf表示您希望它采用该参数作为指针并取消引用它。但是str[strlen(str)]返回一个char,而不是char指针。因此,您最终要么传递零(printf有助于打印(null),要么传递1到255之间的数字),该数字不是有效的指针,并且会导致您看到的分段错误。