【问题标题】:Accepting String when format specified is character指定格式为字符时接受字符串
【发布时间】:2016-03-02 14:34:42
【问题描述】:

我有以下代码。我在想我应该一次只输入一个字符。但即使我在一行中输入一个像 hello 这样的字符串,它也能正确接受。为什么是这样?是否与标准输入缓冲区刷新问题有关?

#include <stdio.h>
#include <malloc.h>
#include <conio.h>


int main()
{
    char sourceString [100];
    int index=0;
    printf("Enter the characters one by one enter * to stop\n");
    do
    {
        scanf("%c",&sourceString[index]);
        index++;
    } while (sourceString[index-1]!='*');

    index=0;
    while (sourceString[index]!='*')
    {
        printf("%c",sourceString[index]);
        index++;
    }
    printf("\n");

    return(0);
}

【问题讨论】:

  • "如果我在一行中输入一个像 hello 这样的字符串,它会正确接受" --> 这与您的预期有何不同?

标签: c string char scanf


【解决方案1】:

当您输入 字符串 并按 ENTER 时,整个字符串进入输入缓冲区stdin

接下来,根据%c 格式说明符的属性,如C11 标准第7.21.6.2 章所述,fscanf()

匹配字段指定数字的字符序列 宽度(如果指令中没有字段宽度,则为 1)。

它将匹配(并扫描和存储)缓冲区中的第一个条目 (char),而其余的缓冲区内容保持不变。

当您在循环中运行scanf() 时,下一次调用将再次从输入缓冲区读取(并继续,只要它们的内容在stdin 缓冲区中未决)。

【讨论】:

    【解决方案2】:

    这里有什么问题?它一次接受一个字符,无论有多少个字符,并将一次一个字符放入数组中,直到满足条件。这只是一种(更复杂的)输入带有星号 (*) 的字符串的方法,其作用类似于空终止符 ('\0')。

    顺便说一下,您应该在第一个循环中检查边界。添加类似这样的内容,否则当输入字符串大于 100 个字符时,您的程序将因段错误而崩溃。

    do {
        // your code here
    } while ((sourceString[index-1]!='*') && (index < 100));
    

    【讨论】:

      【解决方案3】:

      使用 scanf 时,您需要使用空格字符(例如 \n)终止输入。当您输入换行符时,scanf 将完成读取输入。但是,由于您有一个循环,它会一直读取输入,直到您输入“*”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多