这被认为非常简单,但我无法从键盘读取连续输入.
这是代码:
#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)
此外,该程序不适用于包含多个单词的字符串.我怎么能克服这些问题?
首先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的第一个问题通常是通过在格式前加一个空格来解决.这将占用包括前一行的空白区域'\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)
最后,代码应该使用错误检查和输入宽度限制.测试所有输入函数的返回值.