首页 > 解决方案 > 如何将格式化的字符串传递给C中的结构?

问题描述

在将字符串拆分为 struct 的元素时引用了类似的问题。

在我的项目的一部分中,我一直在进入signal: segmentation fault (core dumped). 我的任务是从文件(文件的一行)中提取格式化字符串,并将其转换为结构。例如,我已经提取了一个字符串“t,a,1990”,我想用它sscanf来生成一个结构体s,其中s.title是“ t”等等。我注意到在给定的结构中,标题和艺术家都是指针。我是该语言的新手,我想知道为什么在这里将指针 ( s.titleand s.artist) 传递给指针是无效的。

如何在不更改 struct def 的情况下解决它?

这是我的代码:

#include  <stdio.h>

typedef struct {
  char* title;
  char* artist;
  int year;
} song;

int main(void) {

    song s;

    // read from string

    char str[]= "t,a,1990";
    char* strptr = str;

    sscanf(strptr, "%s,%s,%d", s.title, s.artist, &(s.year));
    printf("title = %s, artist = %s, year= %d\n", s.title, s.artist, s.year);

    return 0;
}

谢谢!

标签: c

解决方案


每个变量代表一个特定的内存量。如果您尝试使用比分配(保留)更多的内存,则会发生分段错误。

在这种情况下,您“将字符串读取到内存”,而没有分配任何内存来实际保存该内存。您提供的指针实际上并不指向任何东西。

因此,要么:

  • 动态分配足够的内存(别忘了清理)
  • 在编译期间保留足够的内存。

对于后一种情况,您的结构将如下所示:

typedef struct {
  char title[20];
  char artist[20];
  int year;
} song;

此结构为您的字符串保留 20 个字符。只要你的弦比那个短,你就没事。如果它变得更长,您将遇到与以前相同的问题。

此外,里面的大括号&(s.year)是不必要的。(&s.year完全没问题)。

如果您想“不更改结构定义”,则需要使用动态内存分配。

用于此目的的 C 中的关键函数是mallocand free(需要stdlib.h)。因此,您的代码将变为:

char str[]= "t,a,y";
char* strptr = str;

s.title = malloc(20);
s.artist = malloc(20);

sscanf(strptr, "%s,%s,%d", s.title, s.artist, &s.year);
printf("title = %s, artist = %s, year= %d\n", s.title, s.artist, s.year);

free(s.title);
free(s.artist);

未能调用“免费”会导致内存泄漏。


推荐阅读