【发布时间】:2011-06-26 05:26:13
【问题描述】:
我想让 readline 接受一个 int。实现这一目标的最佳方法是什么?我接受这样的字符串输入没有问题:
char *usrname; // define user input
/* accept input */
printf("Enter new name:");
usrname = readline(NULL);
我明白,拥有一个 int 需要在接受输入之前对 进行一些错误检查。
【问题讨论】:
我想让 readline 接受一个 int。实现这一目标的最佳方法是什么?我接受这样的字符串输入没有问题:
char *usrname; // define user input
/* accept input */
printf("Enter new name:");
usrname = readline(NULL);
我明白,拥有一个 int 需要在接受输入之前对 进行一些错误检查。
【问题讨论】:
Eduardo Costa's answer 有效,但它会泄漏内存。最好定义一个函数来为您处理这个问题:
int readint(char *p, char **e)
{
char *c = readline(p);
int i = strtol(c, e, 0);
if(e)
{
size_t o = (size_t)(*e - c),
l = strlen(*e) + 1;
*e = malloc(l);
// error checking omitted
memcpy(*e, c + o, l);
}
free(c);
return i;
}
此版本甚至会保留在线上的任何额外内容,以便您以后需要时可以使用它。当然,如果你需要对额外的东西做很多事情,你最好只阅读该行并自己解析它,而不是使用这样的函数。
【讨论】:
if 中使用*e = strdup(*e); 不是更方便吗?或者,如果您认为 strdup() 过于 POSIX-ish,则使用:size_t len = strlen(*e) + 1; char *str = malloc(len); if (str) { memcpy(str, *e, len); *e = str; }。我也不完全相信e 正在被使用。有双重用法 - 我的第二个替代版本更清楚地表明,它引入了 str 以避免同时在 *e 中存储两个值。
strdup 确实让整个事情变得更容易。
memcpy(*e, c + o, l);,不是吗?
你尝试过这样的事情吗?
int i = atoi(readline(NULL));
【讨论】:
free 无法得到readline 返回的字符串,这是一个相当严重的问题。
int,atoi 也会有未定义的行为。最好使用strtol。