我正在从字符串中打印出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 = 输入: 字符var->字符已打印 str [strlen(str)-1]->吗? str [strlen(str)]->吗? str [strlen(str)+1]->吗? str [100]->? str [101] ... str [104]->吗? str [105]->每次更改的垃圾值 现在,我的问题从为什么不打印null字符改为为什么打印null之前的char?即使对于超出范围的值?????? 编辑: 少于给定How are you?
printf(“%s”,str [strlen(str)])返回->(空)segmentation fault
并大于给定(null)
答案 0 :(得分:2)
正如其他评论所说,这是未定义的行为。但是,您的程序有可能实际上是在字符串开头之后读取并打印了104个字节的字符,并且您的终端程序不知道如何打印该字符,因此最终在输出中出现?
。
让我更担心的是您的编辑printf("%s", str[strlen(str)])
。将%s
传递给printf表示您希望它采用该参数作为指针并取消引用它。但是str[strlen(str)]
返回一个char,而不是char指针。因此,您最终要么传递零(printf有助于打印(null)
,要么传递1到255之间的数字),该数字不是有效的指针,并且会导致您看到的分段错误。