使用scanf()从键盘读取时读取前一输入的换行符

El *_*Cid 13 c string char

这被认为非常简单,但我无法从键盘读取连续输入.

这是代码:

#include <string.h>
#include <stdio.h>

int main()
{
    char string[200];
    char character;
    printf ("write something: ");
    scanf ("%s", string);
    printf ("%s", string);
    printf ("\nwrite a character: ");
    scanf ("%c", &character);
    printf ("\nCharacter %c  Correspondent number: %d\n", character, character);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

怎么了

当我输入一个字符串(例如:计算机)时,程序会读取换行符('\n')并将其放入character.以下是显示的外观:

 write something: computer
 computer
 Character:
    Correspondent number: 10
Run Code Online (Sandbox Code Playgroud)

此外,该程序不适用于包含多个单词的字符串.我怎么能克服这些问题?

hac*_*cks 9

首先scanf读取输入的字符串并留\n在输入缓冲区中.下一次调用以scanf读取\n并存储它character.
试试这个

scanf (" %c", &characte);   
     // ^A space before %c in scanf can skip any number of white space characters. 
Run Code Online (Sandbox Code Playgroud)

程序不适用于多个字符串的字符串,因为scanf停止读取一次会找到空格字符.你可以fgets改用

 fgets(string, 200, stdin);
Run Code Online (Sandbox Code Playgroud)

  • OP使用`printf()`是正确的.使用`int`(或很少`unsigned`)的常用比例来提升像`char character`这样的变量参数,因此不需要强制转换`int`.`printf("%c%d",...`需要两个`int`参数,因此OP使用正确的说明符."d,i'int`参数被转换...""c如果没有l长度修饰符存在,`int`参数......"C11§7.21.6.18 (2认同)

chu*_*ica 5

OP的第一个问题通常是通过在格式前加一个空格来解决.这将占用包括前一行的空白区域'\n'.

// scanf("%c", &character);
scanf(" %c", &character);
Run Code Online (Sandbox Code Playgroud)

此外,该程序不适用于包含多个单词的字符串.我怎么能克服这些问题?

对于第二个问题,让我们更准确地理解"字符串"以及它是什么"%s".

是由封端的字符的连续序列,并且包括第一个空字符.7.1.1 1

即使报告"我输入字符串(例如:计算机)",OP也没有输入字符串.OP正在输入一行文字.8个字符"计算机"后跟Enter.这里没有"空字符".相反9 char "computer\n".

"%s"scanf("%s", string);做三件事情:

1)扫描,但不保存任何前导空白区域.

2)扫描并保存到string任意数量的非白色空间.

3)到达白色空间或EOF时停止扫描.那char只是回到了stdin.'\0'附加A 以string使该char数组成为C 字符串.

要读取包含空格的行,请不要使用 scanf("%s",....考虑fgets().

fgets(string, sizeof string, stdin);
// remove potential trailing \r\n as needed
string[strcspn(string, "\n")] = 0;
Run Code Online (Sandbox Code Playgroud)

混合scanf()fgets()是像呼叫的问题scanf("%s", string); fgets(...)离开了'\n'stdin用于fgets()读取,只由一条线"\n".建议使用(或在*nix系统上)读取所有用户输入. 然后解析读取的行.fgets()getline()

fgets(string, sizeof string, stdin);
scanf(string, "%c", &character);
Run Code Online (Sandbox Code Playgroud)

如果代码必须用户scanf()读取包括空格的用户输入:

scanf("%*[\n]"); // read any number of \n and not save.
// Read up to 199 `char`, none of which are \n
if (scanf("%199[^\n]", string) != 1) Handle_EOF();
Run Code Online (Sandbox Code Playgroud)

最后,代码应该使用错误检查和输入宽度限制.测试所有输入函数的返回值.