害怕 c 中的奇怪行为
fread weird behavior in c
我写了一段代码只是为了了解 fread 的工作原理,但我不明白这是怎么可能的。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
void main(){
char spool[5] = "hello";
fread(spool, sizeof(char), 6, stdin); //stdin == "bonjour"
printf("\n%s\n", spool);
}
所以首先,我认为 spool 的值会被 "bonjo" 取代,但我得到了 "bonjou"。我不明白为什么我得到一个 6 个字符的字符串而不是 5 个字符的字符串。
你所拥有的是未定义的行为。您正在尝试将 6 个字符读入一个可以容纳 5 个字符的数组 characters.Please 请注意,该数组应该足够大以容纳一个 nul 终止符。
增加数组的大小spool
以容纳所需的字符。
您需要增加 spool
缓冲区的大小,(它不能存储超过 5 char
s,这会导致未定义的行为):
#include <stdio.h>
#include <stdlib.h>
int main(){
char spool[15] = "hello";
fread(spool, sizeof(char), 6, stdin); //stdin == "bonjour"
printf("\n%s\n", spool);
}
输出:
bonjou
char spool[5] = "hello";
这是错误的,因为 C 中的字符串以 null 结尾。您不为空终止分配 space 。一个体面的编译器应该给你一个警告。 (显然 gcc 甚至没有使用 -Wall -Wextra,所以那很糟糕)。
将 "bounjour" 读入该数组也是错误的,因为 C 数组没有边界检查,也没有任何库函数。因此,如果您尝试在数组中存储比可用空间更多的数据,您将在数组边界之外写入,并且程序将(希望)崩溃。您调用未定义的行为,所以任何事情都可能发生。
通过声明一个足够大的数组来解决这个问题,并研究字符串的空终止。
我写了一段代码只是为了了解 fread 的工作原理,但我不明白这是怎么可能的。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
void main(){
char spool[5] = "hello";
fread(spool, sizeof(char), 6, stdin); //stdin == "bonjour"
printf("\n%s\n", spool);
}
所以首先,我认为 spool 的值会被 "bonjo" 取代,但我得到了 "bonjou"。我不明白为什么我得到一个 6 个字符的字符串而不是 5 个字符的字符串。
你所拥有的是未定义的行为。您正在尝试将 6 个字符读入一个可以容纳 5 个字符的数组 characters.Please 请注意,该数组应该足够大以容纳一个 nul 终止符。
增加数组的大小spool
以容纳所需的字符。
您需要增加 spool
缓冲区的大小,(它不能存储超过 5 char
s,这会导致未定义的行为):
#include <stdio.h>
#include <stdlib.h>
int main(){
char spool[15] = "hello";
fread(spool, sizeof(char), 6, stdin); //stdin == "bonjour"
printf("\n%s\n", spool);
}
输出:
bonjou
char spool[5] = "hello";
这是错误的,因为 C 中的字符串以 null 结尾。您不为空终止分配 space 。一个体面的编译器应该给你一个警告。 (显然 gcc 甚至没有使用 -Wall -Wextra,所以那很糟糕)。
将 "bounjour" 读入该数组也是错误的,因为 C 数组没有边界检查,也没有任何库函数。因此,如果您尝试在数组中存储比可用空间更多的数据,您将在数组边界之外写入,并且程序将(希望)崩溃。您调用未定义的行为,所以任何事情都可能发生。
通过声明一个足够大的数组来解决这个问题,并研究字符串的空终止。