【问题标题】:dealing with string in struct处理结构中的字符串
【发布时间】:2013-06-10 20:10:07
【问题描述】:

我的程序必须有一个带有字符串的结构体,像这样

typedef struct _Node {

 char file[MAX];

//other stuff...

} Node;

Node *myPointer;

所以,在其他函数中,我需要从用户那里读取一个字符串并传递给结构中的“文件”变量,如下所示:

char input[MAX];
scanf("%s", input);
(*myPointer).file = input;

问题是用户字符串的大小是可变的,它不能编译...我该怎么办?

//对不起我的英语

【问题讨论】:

  • 除非你想要 C++ 解决方案,否则我建议不要使用 C++ 标签。
  • file 是指向 char 数组的指针,您无法将其更改为输入...您可以循环输入并设置文件
  • 如果您不知道用户输入有多大,您应该考虑使用fgets 获取输入。
  • @sthi: file 是一个字符数组,它不是一个指针。不要迷惑​​人
  • @MooingDuck 在 (*myPointer).file = input 的上下文中;行它是一个指向字符数组的指针...

标签: c string struct char


【解决方案1】:

比较简单:

scanf("%s", myPointer->file);

字符串的安全处理:

strncpy(myPointer->file, input, MAX);
myPointer->file[MAX - 1] = 0;

【讨论】:

    【解决方案2】:

    如果你只是想用 %s 扫描一个字符串,我建议你使用 stdin 的 fgets,它可以限制最大长度。

    如果您想从用户输入中扫描更复杂的格式,您可以使用 fgets 读取限制长度字符串,然后使用 sscanf 来获取您需要的内容。

    直接使用 scanf 可能会导致潜在的安全问题,在 C 中执行任何字符串缓冲区操作时要小心。

    【讨论】:

      【解决方案3】:

      这是一个 C++ 解决方案:

      #include <string>
      #include <iostream>
      
      struct Node {
       std:string file;
      };
      

      然后

      Node node;
      std::getline(std::cin, node.file);
      

      【讨论】:

      • 差不多。在_Node 上去掉下划线 :-)
      • @Angew 谢谢。我受过训练,不会看到前导下划线:-)
      【解决方案4】:

      这是因为你的结构体中的变量文件在定义结构体并分配内存时是一个静态数组地址(与char数组[]相同),所以不能为其分配新的字符串数组地址。因此你可以通过以下方式修改您的代码:

      1.正如 nouney 回答的那样,scanf("%s", (*myPointer).file);

      2.使用strcpy函数将数组输入复制到myPointer.file数组中

      3.用下面重新定义你的结构:

      typedef struct _Node {
      
       char *file;
      
      //other stuff...
      
      } Node;
      
      Node *myPointer;
      

      然后分配输入使用malloc函数的内存,例如:

      input = (char *)malloc(sizeof(char) * MAX);
      scanf("%s", input);
      myPointer->file = input;
      

      完成后不要忘记释放数组文件。

      【讨论】:

        【解决方案5】:
        (*myPointer).file = input;
        

        仅使成员文件指向与输入相同的地址。如果要将输入的内容复制到 myPointer->file 中,则必须使用 strcpy 或 strncpy。您还需要确保您的字符串以空值结尾。

        memset(myPointer->file, 0, MAX);
        strncpy(myPointer->file, input, MAX-1);
        

        以上是通用的,因为输入字符串可以是任何以空字符结尾的字符串。如果您需要直接从用户输入中获取字符串,则 nouney 的答案是最简单的。

        【讨论】:

        • file 是一个数组,而不是一个指针。它不能重新分配,所以你的第一句话是错误的。
        • 我应该澄清一下,这个答案的其余部分是 100% 正确、有用和令人敬畏的,第一句话只是 pedantically 错误。
        【解决方案6】:

        您正在使用typedef 声明一种结构类型,然后您创建了指向该类型的指针,但未创建对象。 那么当你没有内存时,你想把你的数据放在哪里。

        先为对象分配内存。

        输入后使用strcpy()

        【讨论】:

        • 哦,我知道我必须分配内存,但这不是我的实际代码。这只是一个重要部分的示例。谢谢!
        【解决方案7】:

        你可以试试吗:

            gets(input);
            strcpy(mypointer->file, input);
        

        【讨论】:

          【解决方案8】:

          如果这是 C++,则使用 std::string。如果是C,那么直接在(*myPointer).file中读取用户输入。

          【讨论】:

          • 我无法直接阅读,因为我实际上会在某些“if case”中使用输入......所以,只有在少数情况下我会这样做 (*myPointer).file = input。 ..
          • 但这是错误的,您必须strcpy您的输入,而不是分配指向缓冲区的指针。
          【解决方案9】:

          你应该这样做:

          scanf("%s", (*myPointer).file);
          

          您无需再次复制缓冲区。

          【讨论】:

          • 你如何防止缓冲区溢出?
          • 你不能用scanf()。看看at this question
          • 哦,但这只是一个例子......事实上,我需要一个变量“输入”,因为我将在其他函数中使用它......然后,只有在少数情况下我'将需要做 (*myPointer).file = input.. 在某些情况下我不能这样做...
          • 那么你将不得不使用strncpy() 将你的input 变量复制到结构的file 成员中。
          猜你喜欢
          • 2014-08-24
          • 2016-05-24
          • 1970-01-01
          • 2021-01-13
          • 1970-01-01
          • 1970-01-01
          • 2017-03-22
          • 2016-04-28
          • 1970-01-01
          相关资源
          最近更新 更多