我在程序中对SEGFAULT感到困惑。我正在尝试实现scanf。所以我传递const char作为第一个参数,而不是为%条目解析它,而是使用变量参数来存储值。
我对此很困惑。
我不是C和C ++编程的专家。但我理解内存分配和使用。
这是我的代码片段。
我使用getline传递给它NULL指针指向char,0作为大小。根据手册,它本身应该是malloc记忆
我认为一些功能分配内存是个坏主意。但是让我们考虑一下就可以了
由于这个func有malloc内存,所以我必须释放它,但是当我试图这样做时,我得到了分段错误,但是如果我保持原样,程序中没有内存泄漏。我正在使用valgrind检查内存泄漏。
或者,在调用getline()之前,* lineptr可以包含一个 指向malloc(3)分配缓冲区* n字节大小的指针。如果 缓冲区不足以容纳线,getline()调整它的大小 使用realloc(3),根据需要更新* lineptr和* n。
这是我的代码段。
s = va_arg(argp, char *);
if (lengthIsSet) {
size_t newLen ;
size_t readLen;
char *strInput = NULL;
length = atoi(lengthStr.c_str());
readLen = getline (&strInput,&newLen,inputSteam);
if (!strInput) {
break;
}
int sizeToCopy = (length<readLen)?length:readLen;
memcpy(s,strInput,sizeToCopy+1);
s[sizeToCopy] = '\0';
}
我已经尝试初始化size_t newLen = 0;
它似乎工作知道,但我认为它不会导致问题。请帮忙解决这个问题。我将非常感谢任何帮助和解释。
修改
请建议如何使用C ++正确读取用户输入。不使用显式scanf,vscanf等。请帮忙,因为我花了几个小时处理这个问题。我发现只有这个函数可以从流中读取用户输入。也许使用C ++函数有任何好方法。我不是C ++和C的专家,所以不知道很多功能。
编辑2
void scanfCustom(const char* input, FILE *inputSteam, va_list argp) {
const char *p;
int * i;
bool formFound = false;
std::string lengthStr("");
int length;
bool lengthIsSet = false;
unsigned u;
char *s;
p = input;
for (; *p != '\0'; p++) {
if ((formFound) && ( *p >= '0' && *p <= '9' ) ) {
lengthStr+=(*p);
lengthIsSet = true;
continue;
}
if (*p == '%') {
formFound = true;
continue;
}
formFound = false;
switch (*p) {
case 's':
s = va_arg(argp, char *);
if (lengthIsSet) {
size_t newLen = 0;
size_t readLen;
char *strInput = NULL;
length = atoi(lengthStr.c_str());
readLen = getline (&strInput,&newLen,inputSteam);
if (!strInput) {
break;
}
int sizeToCopy = (length<readLen)?length:readLen;
memcpy(s,strInput,sizeToCopy+1);
s[sizeToCopy] = '\0';
// free(strInput);
//fgets(s,length,inputSteam);
}
//TODO READ FULL STR
}
}
}
答案 0 :(得分:0)
如果getline失败会发生什么情况(例如输入流无效或用户在没有任何输入的情况下执行ctrl-c)?
getline将返回-1,您将崩溃。