【问题标题】:Readline accept int from console in CReadline 从 C 中的控制台接受 int
【发布时间】:2011-06-26 05:26:13
【问题描述】:

我想让 readline 接受一个 int。实现这一目标的最佳方法是什么?我接受这样的字符串输入没有问题:

 char *usrname; // define user input

 /* accept input */
 printf("Enter new name:");
 usrname = readline(NULL);

我明白,拥有一个 int 需要在接受输入之前对 进行一些错误检查。

【问题讨论】:

    标签: c input int readline


    【解决方案1】:

    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 中存储两个值。
    • @Jonathan - 它可能更清晰或更容易,实际上重新检查它让我意识到它有一个错误,但是(现在它已经修复)它应该可以正常工作。不过,您的版本更简洁,strdup 确实让整个事情变得更容易。
    • 我认为您复制数据的方向错误 - 应该是 memcpy(*e, c + o, l);,不是吗?
    • @Jonathan - 确实。从我的 iPhone 编写代码而不检查它是一个糟糕的策略。
    【解决方案2】:

    你尝试过这样的事情吗?

    int i = atoi(readline(NULL));
    

    【讨论】:

    • -1 这使得free 无法得到readline 返回的字符串,这是一个相当严重的问题。
    • 如果值不适合intatoi 也会有未定义的行为。最好使用strtol
    • 对不起,我的错误。我太天真了,假设一个简单的问题(就像我在大学时必须解决的问题)——因为使用 C+readline 读取 int 看起来不像是一个复杂的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2014-04-22
    • 2017-12-06
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多