我的程序必须有一个带字符串的结构,比如
typedef struct _Node {
char file[MAX];
//other stuff...
} Node;
Node *myPointer;
所以,在其他函数中,我需要从用户读取一个字符串并传递给我的"文件"结构中的变量,如下所示:
char input[MAX];
scanf("%s", input);
(*myPointer).file = input;
问题是用户字符串的大小是可变的,它不会编译......我该怎么办?
//对不起我的英文
答案 0 :(得分:3)
这是一个C ++解决方案:
#include <string>
#include <iostream>
struct Node {
std:string file;
};
然后
Node node;
std::getline(std::cin, node.file);
答案 1 :(得分:2)
你应该这样做:
scanf("%s", (*myPointer).file);
您无需再次复制缓冲区。
答案 2 :(得分:1)
(*myPointer).file = input;
仅使成员文件指向与输入相同的地址。如果要将输入内容复制到myPointer-&gt;文件中,则必须使用strcpy或strncpy。此外,您需要确保您的字符串为空终止。
memset(myPointer->file, 0, MAX);
strncpy(myPointer->file, input, MAX-1);
以上是一种通用的,因为在输入字符串中可以是任何以null结尾的字符串。如果你需要直接从用户输入获取字符串,nouney的答案是最简单的。
答案 3 :(得分:0)
如果这是C ++,请使用std::string
。如果这是C,则直接在(*myPointer).file
。
答案 4 :(得分:0)
gets(input);
strcpy(mypointer->file, input);
答案 5 :(得分:0)
您正在使用typedef
声明一种类型的结构,然后您创建了指向该类型的指针,但未创建对象。
那么当你没有记忆时,你想把你的数据放在哪里。
首先为对象分配内存。
输入后使用strcpy()
。
答案 6 :(得分:0)
那是因为结构中的变量文件是一个静态数组地址(与char array []相同),当定义结构并分配内存时。因此无法为其分配新的字符串数组地址。因此,您可以通过以下方式修改代码:
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;
完成后不要忘记释放数组文件。
答案 7 :(得分:0)
如果你只想用%s扫描一个字符串,我建议你使用stdin的fgets,它可以限制最大长度。
如果要从用户输入中扫描更复杂的格式,可以使用fgets读取限制长度字符串,然后使用sscanf来获取所需内容。
直接使用scanf可能会导致潜在的安全问题,在C中执行任何字符串缓冲操作时要小心。
答案 8 :(得分:0)
更简单:
scanf("%s", myPointer->file);
这是字符串的安全应对:
strncpy(myPointer->file, input, MAX);
myPointer->file[MAX - 1] = 0;