【问题标题】:scan arbitrary number of chars in c扫描c中的任意数量的字符
【发布时间】:2020-06-24 10:35:17
【问题描述】:

我想读取未知数量的字符,不超过 10 个。

char word[10];
for( i=0;i<10;i++){
    if( !scanf("%c",&word[i])){ //terminate with 0
        getchar();
        break;
    }   
} 

问题是数字也是一个字符,所以 if 语句不会被执行。是否有任何其他解决方案可以终止字符输入,例如使用 0。

【问题讨论】:

  • 提示:scanf() 不返回扫描的条目,它返回扫描和匹配的项目数。
  • 所以如果我输入 0,那么什么都不会被扫描?
  • 为什么不呢?但它不返回 0,以防扫描成功。
  • 所以在这种情况下我必须写:scanf(..)==0.
  • 我建议使用 getchar() 来读取单个字符。本帖相关stackoverflow.com/questions/14419954/…

标签: c arrays scanf


【解决方案1】:

建议:

char word[10];

if( scanf("%9s",word) != 1 )
{
    fprintf( stderr, "scanf for (max 9 char word) failed\n" );
    exit( EXIT_FAILURE );
}   

使用%9s,因为%s 输入格式转换说明符总是将一个NUL 字节附加到输入。

如果输入少于 9 个字符,则处理得当。

如果输入大于 9 个字符,9 修饰符将停止输入,因此输入缓冲区不会溢出。这样的溢出会导致未定义的行为。

【讨论】:

  • 所以为了输入 10 个字符,我必须将 %9 更改为 %10 和 char word[11],以便在 word[10] 位置是 NUL 字节?
【解决方案2】:

您可以检查您刚刚阅读的字符(在 word[i] 处),如果无效(例如不是字母表)而不是 break。

【讨论】:

    【解决方案3】:

    您可以使用do..while 循环。类似(伪代码)

    int keep_looping = 1;
    int counter = 0;
    do {
        ret = scanf(" %c",&word[counter]);
        if (!ret) continue;  //can use more cleanup and error check
        if (word[counter] == '0') keep_looping =0;
        counter++;
        }
    while (keep_looping && counter < 10)
    

    【讨论】:

    • @RobertSsupportsMonicaCellio 也许我不;t,想开导吗?
    • 不可能。我也在画空白。 ;-)
    • 感谢您的解决方案。如果keep_looping为0,为什么while循环会终止?
    • 因为控制表达式必须评估为 TRUE 值 (1) 才能继续循环。
    • @Boris 如果&amp;&amp; 的子条件计算为0,则主要条件不是true,因此循环不再迭代。
    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多