Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Xcode中处理字符串时没有遇到错误?_C_Arrays - Fatal编程技术网

为什么在Xcode中处理字符串时没有遇到错误?

为什么在Xcode中处理字符串时没有遇到错误?,c,arrays,C,Arrays,在Xcode中,我声明了一个名为myString的字符串,内存中有5个空格 int main() { char myString[5]; printf("Insert a string: "); scanf("%s", myString); printf("Your string is %s.", myString); return 0; } 问题是,每当我键入一个超过4个字符的单词时,控制台仍然会打印出printf()my string,而不是抱

在Xcode中,我声明了一个名为
myString
的字符串,内存中有5个空格

int main() {

    char myString[5];

    printf("Insert a string: ");
    scanf("%s", myString);
    printf("Your string is %s.", myString);

    return 0;
}
问题是,每当我键入一个超过4个字符的单词时,控制台仍然会打印出
printf()
my string,而不是抱怨它


这是因为什么呢?

C会很高兴地把你交给它的任何记忆都抹掉。AKA,缓冲区溢出。:-)

在您的情况下,正如您定义的
myString
有5个
char
s,任何运行时间超过4个char的输入(将终止null也视为第5个字符)实际上都会导致越界内存访问,从而产生错误。结果可以是任何东西,正常工作,就好像分配了足够的内存

您应该使用

 scanf("%4s", myString);
同样地


另外,请注意,
main()
的建议签名是
intmain(intargc,char*argv[])
或者至少是
intmain(void)

谢谢!那么为什么编译器不抱怨而不是打印整个字符串呢?这听起来很奇怪。@CeceXX字符串是由用户在运行时输入的,因此编译器对此一无所知。它也不能记录数组的大小。您需要自己处理。@CeceXX编译器不知道在提供的指针上分配的内存,也不控制运行时输入,因此没有理由抱怨。程序员有责任确保缓冲区不会溢出。非常感谢大家!非常感谢:-)@Sourav只要你允许,我都会接受你的回答。也谢谢你编辑我的问题!仅供参考-此问题与Xcode完全无关。这是C语言的一个“特性”。