为什么在Xcode中处理字符串时没有遇到错误?
在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,而不是抱
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语言的一个“特性”。