将字符串传递给C中的struct

时间:2019-02-05 10:26:23

标签: c pointers struct

我是C语言的初学者,需要帮助将字符串保存到结构中。

(我尝试了多种方法来完成它,但是程序什么都不打印,或者我得到了(0xC0000005),或者程序关闭了。。(我尝试使用指针作为参数,但是效果是相同的,或者直接将scanf用于text.line等等。)如果有人简单地向我解释了应该如何做,我会很高兴-我感到我仍然不完全理解指针的概念,这就是问题所在; q。

lapply

4 个答案:

答案 0 :(得分:2)

在C中将参数传递给函数时,它会创建该参数的副本,因此main中的text变量与save_line中的变量不同。

您需要将指针text传递到save_line函数,如下所示:

void save_line(label *text) {

  printf("Write your name\n");
  char *helper=malloc(30 * sizeof *helper);

  scanf("%s", helper);
  text->line = helper;

}

在主要方面:

void main(){
  label text;
  save_line(&text);
  printf("%s", text.line);
}

答案 1 :(得分:2)

line中没有空间来分配您的字符串,因为它只是一个未初始化的指针,因此您将必须为其保留一些内存。此外,您的函数正在分配未释放的内存(对于helper,对于同一字符串,您将不需要两束不同的内存)。

#include<stdlib.h>
#include<stdio.h>

const uint8_t MAX_NAME_SIZE = 20;

typedef struct label{
    char *line;
}label;

void save_line(label text){
    printf("Write your name (max len %u chrs):\n",(MAX_NAME_SIZE-1));
    scanf("%s", text.line);
}

void main(){
    label text;
    text.line = malloc(MAX_NAME_SIZE);
    save_line(text);
    printf("%s", text.line);
    free(text.line);
}

我更喜欢在同一范围内分配和取消分配内存,以避免内存泄漏(在同一函数内部,在main内部等),因此为了保持结构,例如在main。您应该考虑自己的设计,并分析label text;应该具有的范围。

答案 2 :(得分:1)

您的代码在许多层面上都是错误的:

您可能想要这样的东西:

#include <stdio.h>
#include <stdlib.h>

typedef struct label {
  char *line;
}label;

void save_line(label *text) {   // use label *ttext instead of label text
  printf("Write your name\n");
  text->line = malloc(30 * sizeof *text->line);   // no need for strcpy here anyway 
  scanf("%s", text->line);
}

int main() {               // main should return int *
  label text;
  save_line(&text);        // pass the pointer to text, not just text
  printf("%s", text.line);
  free(text.line);         // free allocated memory
}

尽管如此,仍有改进的空间,例如scanf("%s"), ...很危险,因为如果用户键入太多字符,则会导致缓冲区溢出。

*请阅读:What should main() return in C and C++?

答案 3 :(得分:0)

strcpy仅将源指向的内容复制到目标。它不会在目标位置为要复制的内容分配空间。

如果您的平台有strdup,则可以改用它:

text.line = strdup(helper);

如果没有,请在text.line之前在strcpy中分配一些空间

text.line = malloc(strlen(helper) + 1); // +1 for the null byte at the end
 strcpy(text.line, helper);