Çprintf()
,scanf()
,fscanf()
,实际上大部分的字符串功能也适用空结束的字符串。
在计算机程序中,空终止字符串存储为一个包含字符的阵列,并用空字符('\0'
,在ASCII称为NUL)终止的字符串。
因此,当您的输入包含3个字符时,还必须为空字符保留空间。 在你的榜样,缓冲区应该是大小至少为4
为了防止用户错误,你总是可以使用限制输入的大小:
char buffer[16]; // An array of 16 for example
scanf("%15s", buffer); // Must also reserve space for the null
注意,Segmentation fault
你得到的是不是由于fscanf()
函数试图将NULL
写入缓冲区的第4个字符。 这只会覆盖堆栈上的一些局部变量。
该错误是最有可能是由于写NULL
到的指针文件存储的存储位置(FILE *fp
),上而下一次迭代产生Segmentation fault
,当我们试图从文件中再次读取。
来说明吧,这是你的筹码看起来的样子:
| buffer[0] | buffer[1] | buffer[2] | fp | fp | fp | fp | ...
fscanf()
尝试写"123\0"
到缓冲区,因此它与缓冲器的起点开始,并在地方放1,2,3分别为0,1,2。但是NULL
字符恰好放置在fp
的一部分,因此破坏了指针。
'字符缓冲区[3];' - >' char buffer [4];','fscanf(fp,“%s”,buffer)' - >'fscanf(fp,“%3s”,buffer)' – BLUEPIXY
您忘记了字符串的'\ 0' .txt内容将在您的程序中转换为“123 \ 0”。将缓冲区[3]更改为缓冲区[4]; –
将缓冲区[3]更改为缓冲区[256],并停止bean计数(除非您在某些受RAM限制的嵌入式系统上)。 – ThingyWotsit