【问题标题】:scanf or getchar 10000 times at a time then program stopped in c一次scanf或getchar 10000次然后程序在c中停止
【发布时间】:2015-04-22 04:53:14
【问题描述】:
#include "stdio.h"

int main() {
    int ch,i;
     for (i = 0; i < 10000; ++i) {
        scanf(" %c", &ch);
        putchar(ch);
     }
     return 0;
}

如果您输入的字符数少于 1000,它会起作用,但如果您一次输入的字符数为 10000,则程序会停止。我可能认为这是因为标准输入缓冲区。 我该如何解决这个问题?

这里有更具体的来源。

#include "stdio.h"
#include "stdlib.h"

int main() {
    int i,n;
    char *p, ch;

    scanf("%d", &n);
    p = (char*) malloc(sizeof(char) *n);

    if (p == NULL) {
        return -1;
    }

    for (i = 0; i < n; ++i) {
        scanf(" %c", &ch);
        putchar(ch);
    }
    return 0;
}

Abode 来源是样本。 - 放入n(要阅读的字数)然后放入长长的字符串。程序已停止或等待完成。

输入示例 1.

2000 lsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdk lsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdkalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalssdafsdfsdfdd

这个不工作。

但下面的工作。 2.

1000 jsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdkalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalssdafsdfsdfddkdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalsdklsakdjldjsalkfjalssdafsdfsdfdd1

【问题讨论】:

  • 我想知道你是如何一次放置 10000 个字符的。虽然你可能想要 i
  • 在许多系统上,在终端驱动程序锁定并拒绝接受之前,您不能在单行终端输入上输入超过固定长度(可能只有大约 256 个字节)更多的。在您的系统上,该数字介于 1,000 到 10,000 之间。您必须确定它在哪里(可能是 1024、2048、4096、8192 或比其中一个少一两个字符)。鉴于您的更新,该限制最有可能是 1024 字节。
  • 在其他 shell 或操作系统中尝试。
  • p = (char*) malloc(sizeof(char) *n); 是什么意思,你后来什么都没做。
  • 您是如何将输入输入到您的程序中的?

标签: c scanf getchar


【解决方案1】:

您的for 循环可能如下所示:

for (i = 0; i < n; ++i) {
    scanf(" %c", &p[i]);
    putchar(p[i]);
}

您也可以尝试在代码中刷新stdin 输入缓冲区,因为正确添加以下行:

fflush(stdin);

编辑:由于某些系统上可能存在未定义的行为,因此可能会实施一种替代且更常见的方法,如下所示:

int ch;

while((ch = getchar()) != EOF && ch != '\n') {

      // ...
}

或者您可以通过调用下面的 setvbuf 函数来正确更改流缓冲区大小:

int setvbuf (FILE* stream, char* buffer, int mode, size_t size);

【讨论】:

  • 我尝试使用 fflush(stdin);但结果是一样的。取决于系统,我认为 fflush 是不安全的。谢谢。
  • 根据您的代码,您在动态内存分配后将错误的变量地址传递给您的 scanf 函数。正如我上面写的那样,尝试将 ch 切换到指针“p”。是的,在某些系统中使用 fflush 可能会导致未定义的行为,这不是一种安全的方法,但我假设您正在使用运行 Windows 的台式电脑。如果您正确使用它,它可能适用于该配置。试一试。
  • 最后一分钟的想法,您是否尝试过刷新您的标准输出?您的标准输出缓冲区可能已满,需要刷新。如果您不想每次都刷新缓冲区,可以使用“setvbuf”函数设置流缓冲区大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多