gpt4 book ai didi

c - 将 fscanf/sscanf 字符串传递到结构字段 char[4]

转载 作者:行者123 更新时间:2023-12-02 01:17:51 24 4
gpt4 key购买 nike

下面的两个结构字段定义如何相互区分。

//first struct    
typedef struct{
char *name; //here is the difference
int shares;
} STOCK1;


//second struct
typedef struct{
char name[4]; //here is the difference
int shares;
} STOCK2;


//here inside main()
FILE *fpRead = openFile(input_filename, "r");

STOCK1 s1;
fscanf(fpRead, "%s %d", s1.name, &s1.shares);
printf("%s %d ", s1.name, s1.shares);

STOCK2 s2;
fscanf(fpRead, "%s %d", s2.name, &s2.shares);
printf("%s %d ", s2.name, s2.shares);

代码将打印出来:

MSFT 400
MSFT� 400

如您所见,使用第二个结构,它会在字符串后打印一些垃圾字符。这是为什么?

输入字符串:

MSFT 400
YHOO 100
...

最佳答案

2 个 struct 定义之间的区别是您在一个 struct 中预先分配存储并在另一个 struct 中声明一个指针.

在您的第一个 struct 中,您有 char *char * 是一个指针。它没有指向任何东西。您需要动态分配一些内存,然后将您的 char * 指针指向分配的内存。

在第二个 struct 中,您有 char name[4]。这是一个数组,你被分配给这个数组 4 个字节。这是已分配并可以使用的。

如果您事先不知道缓冲区的大小,请使用第一个 struct。使用 malloc 分配任意数量的内存,例如 1024 字节。然后一次读入1024字节的数据。继续这样做,直到您可以计算出数据总量,然后使用 malloc 分配该数量的内存,然后读入您的数据。

如果您知道您的数据始终为 4 字节长并且永远不会比这更大或更小,请使用第二个 struct。如果需要,可以这样声明:char name[500]。这将为您预分配 500 个字节,只要您的字符串不超过 499 个字符,它就可以工作。但是,您可能会浪费内存(现在这没什么大不了的)。解决此问题的最有效方法是使用 malloc

动态分配您实际需要的内存量

最后一个警告....请记住,C 中的字符串需要足够的内存来存储字符串本身,外加一个空终止符。例如:

/* I am allocating 5 bytes to store my name. 
My name is Alan, so I'm allocating 4 bytes
plus 1 additional byte for the null terminator
*/

char myName[5];
myName[0] = 'A'; // A
myName[1] = 'l'; // l
myName[2] = 'a'; // a
myName[3] = 'n'; // n
myName[4] = '\0'; // Null Terminator

printf("%s", myName); // Prints Alan

关于c - 将 fscanf/sscanf 字符串传递到结构字段 char[4],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41756684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com