【问题标题】:Using scanf to read in certain amount of characters in C?使用scanf在C中读取一定数量的字符?
【发布时间】:2010-12-09 23:53:31
【问题描述】:

我无法接受来自文本文件的输入。我的程序应该读取用户指定的字符串,并且该字符串的长度在运行时确定。当用户运行程序(手动输入值)时它工作正常,但是当我运行老师的文本文件时,它会陷入无限循环。

对于这个例子,当我输入 4 个字符并且他在他的文件中输入的是“ABCDy”时,它会失败。 “ABCD”是我应该阅读的内容,“y”应该稍后用于知道我应该重新开始游戏。相反,当我使用 scanf 读取“ABCD”时,它也会读取“y”。有没有办法使用scanf解决这个问题,假设我不知道字符串应该在运行时多长时间?

【问题讨论】:

    标签: c string scanf


    【解决方案1】:

    通常,您会使用 "%4c""%4s" 之类的内容最多读取 4 个字符(不同之处在于 "%4c" 读取接下来的 4 个字符,而 "%4s" 跳过前导空格并停止如果有空格,则在空格处)。

    但是,要在运行时指定长度,您必须有点棘手,因为您不能使用嵌入了“4”的字符串文字。一种替代方法是使用sprintf 创建您将传递给scanf 的字符串:

    char buffer[128];
    
    sprintf(buffer, "%%%dc", max_length);
    scanf(buffer, your_string);
    

    我应该补充一点:使用printf,您可以通过在格式字符串中放置一个星号 (*) 并在适当的位置传递一个变量来指定宽度/精度:

    int width = 10;
    int precision = 7;
    double value = 12.345678910;
    
    printf("%*.*f", width, precision, value);
    

    鉴于printfscanf 格式字符串非常相似,人们可能会认为scanf 也适用。不幸的是,情况并非如此——scanf 转换规范中的星号表示应该扫描但不转换的值。也就是说,输入中必须存在的东西,但它的值不会放在任何变量中。

    【讨论】:

      【解决方案2】:

      试试

      scanf("%4s", str)
      

      【讨论】:

      • 它仍然在最后的 y 中读取。而且我不知道价值可能有多长。
      【解决方案3】:

      您也可以使用 fread,您可以在其中设置读取限制:

      char string[5]={0};
      if( fread(string,(sizeof string)-1,1,stdin) )
        printf("\nfull readed: %s",string);
      else
        puts("error");
      

      【讨论】:

        【解决方案4】:

        您可以考虑简单地循环调用getc()

        【讨论】:

        • 这类似于告诉想要精确绘制 80 个像素的人调用 putpixel 80 次。除了学术和基准测试之外,这两者都是一个坏主意,因为您不是向服务器发出单个请求,而是用任意数量的请求轰炸它,每个请求的大小都大于结果。
        猜你喜欢
        • 2013-05-25
        • 2017-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-04
        • 1970-01-01
        相关资源
        最近更新 更多