c - 函数 fscanf 忽略 .txt 文件中的空格分隔符

标签 c struct malloc memcpy scanf

我正在尝试在 C 中扫描以下格式的文本文件:

key01 value01
key02 value02
key03 value03

我想获取键和值字符串并将它们分配给我创建的结构:

struct Mapping
{
  char  key[sizeof(char) * 5];
  char  value[sizeof(char) * 7];
} MapElement;

我的代码如下:

void initialize_server_map(struct Mapping serverMap[])
{
  char* fileName = "server1.txt";
  FILE *fp = fopen(fileName, "r");
  char *lineKey = (char*)malloc(sizeof(char) * 5);
  char *lineValue = (char*)malloc(sizeof(char) * 7);
  int i = 0;
  while (fscanf(fp, "%s %s", lineKey, lineValue) != EOF) {
    struct Mapping mapping;
    memcpy(mapping.key, lineKey, sizeof(char) * 5);
    memcpy(mapping.value, lineValue, sizeof(char) * 7);
    printf("key: %s value: %s\n", mapping.key, mapping.value);
    serverMap[i] = mapping;
    i++;
  }
  fclose(fp);
}

int main(void)
{
  int size = 4;
  struct Mapping serverMap[size];
  initialize_server_map(serverMap);
}

我的输出如下:

key: key01value01 value: value01
key: key02value02 value: value02
key: key03value03 value: value03
key: key04value04 value: value04

自然地,我想要这样的输出:

key: key01 value: value01
key: key02 value: value02
key: key03 value: value03
key: key04 value: value04

我确定它与我分配内存的方式有关。有人可以帮我解决这个问题吗?另外,有没有更有效的方法来做到这一点?

最佳答案

由于数组访问越界,您遇到了未定义的行为。

为了存储 "key01",您需要一个大小至少为 6 的数组 -- 5 用于字符,一个用于终止空字符。

同样,您需要一个大小至少为 8 的数组来存储 "value01"

您声明的数组大小分别为 57。因此,您在使用时越界修改了数组

while (fscanf(fp, "%s %s", lineKey, lineValue) != EOF) {

关于c - 函数 fscanf 忽略 .txt 文件中的空格分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29454244/

相关文章:

c - C 中的递归合并排序和内存分配

c - 当 main 没有参数定义时,argc 和 argv 是否仍然存在于堆栈中?

c - System V IPC 中对 key 的需求

c - 为什么当我读取这个文件并扫描 int 时,输出的数字非常大?

c - 在程序结束时释放 block 没有意义吗?

c - 错误 : Conversion to non-scalar type requested

c - 使用赋值和 printf 时出现段错误 11

c - 逐条记录地从二进制文件中读取数据

我可以在结构中使用 "int"作为我的动态数组吗?

C++ 结构错误