【问题标题】:Why does this only read n-1 strings?为什么这只读取 n-1 个字符串?
【发布时间】:2015-02-11 12:42:46
【问题描述】:

我正在尝试编写一个从stdin 读取并写入stdout 的程序 一个不同长度的字符串数组,但我的程序只读取n-1字符串,虽然我特别告诉它读取n。 到目前为止,这是我想出的:

int main()
{
    char **vectorschar;
    int n, i;
    char c;

    printf("How many strings will you read? : ");
    scanf("%d", &n);

    vectorschar = (char**)calloc(n, sizeof(char*));

    for(i = 0; i < n; i++)
    {
        vectorschar[i] = (char*)calloc(30, sizeof(char));
    }

    for(i = 0; i < n; i++)
    {
        gets(vectorschar[i]);
    }

    for(i = 0; i < n; i++)
    {
        puts(vectorschar[i]);
    }
    return 0;
}

你能指出我正确的方向吗?我仍在学习字符串、IO 和内存在 C 中的工作方式,如果这个问题很愚蠢而且很明显,我很抱歉。

【问题讨论】:

  • 问:输入了要输入的字符串数量之后,您立即按了哪个键?您在此处发布之前是否远程考虑过某种形式的最小调试? (最小的意思是gets() 循环中的一个简单的printf()puts(),它会立即告诉你第一个字符串是空的)。和不相关的,停止使用gets();它是如此邪恶,它不再是标准库的一部分。
  • @WhozCraig ...b.但是调试真的很难!你必须考虑一些东西,运行一个调试器,记录一些东西,做笔记等等,而且没有一个比编码更有趣。如果你能骗到别人,何必费心呢?
  • @Martin James 我在大学一年级,不要对我太苛刻,伙计,没有人教过我如何使用调试器,而且我尝试过的大多数时候我都做不到弄清楚。所以,如果你能停止讽刺,那就太好了。谢谢你的回答。另外,这是我第一次编程,所以我想我最好不要再表现得像一个专家程序员那样犯这样的错误。跨度>
  • 是的,我确实考虑过一个空字符串,但这也是我问这个问题的原因。我曾希望这部分科学领域的人对街区的新孩子不要那么难。@WhozCraig我不会使用它,但它是读取字符串的最简单方法,我被建议使用它
  • @andrei985 建议不要使用gets()。任何时候代码有 IO 问题并且正在使用 gets()scanf(),是时候停止使用这两个了。 fgets()getline() 是更好的用户 IO 替代方案。

标签: c arrays string memory-management


【解决方案1】:

您需要刷新stdin 流以避免'\n' 字符碰到您的gets() 调用。 您可以通过将 \n 添加到您的 scanf() 调用来做到这一点,如下所示:

scanf("%d\n", &n);

编辑:是的,scanf()gets() 更可取。

EDIT2:正如chux 所指出的,它只有在遵守输入格式的情况下才能正常工作。否则,\n 字符之前的所有非格式化数据仍将保留在缓冲区中,影响您的gets() 调用。为避免这种情况,请使用this 示例。

【讨论】:

  • scanf("%d\n", &amp;n); 将使用换行符和 all 后面的空格。 scanf() 不会返回,直到在数字之后检测到一些非空白 - 将其放回 stdin 以供后续 IO。
【解决方案2】:

行后

scanf("%d",&n);

执行后,换行符'\n' 留在流中。第一次调用gets()时使用它。

您可以使用以下命令跳过换行符:

scanf("%d%*[^\n]",&n);
getchar();

【讨论】:

    猜你喜欢
    • 2017-03-15
    • 2016-05-17
    • 2017-04-19
    • 1970-01-01
    • 2020-09-03
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多