我正在尝试使用scanf()获取包含一堆空格分隔的1-3位数字的用户输入,并将它们存储到一个int数组中,并在新行上打印每个单独的数字以进行测试,但它无法正常工作。以下是我到目前为止的情况:
#include <stdio.h>
#include <string.h>
int main()
{
int sourceArr[500];
int i = 0;
printf("\nEnter ciphertext: \n");
while (scanf("%d", &sourceArr[i++]) == 1);
for (int j=0;j<500;j++) {
printf("%d\n", sourceArr[j]);
}
}
因此要求用户输入一系列数字,如下所示:
Enter ciphertext:
23 122 32
我想在sourceArr [0]中存储23,在sourceArr [1]中存储122,在sourceArr [2]中存储32,然后像这样打印每个:
23
122
32
但程序在输入输入后立即闲置,不会打印数字。
答案 0 :(得分:1)
成功时, scanf 会返回成功填充的参数列表的项目数。由于匹配失败,读取错误或文件结束的范围,此计数可以匹配预期的项目数或更少(甚至为零)。
您可以将其更改为:
#include <stdio.h>
#include <string.h>
int main()
{
int sourceArr[500];
int i = 0;
printf("\nEnter ciphertext: \n");
while (scanf("%d", &sourceArr[i++]) == 1);
for (int j=0;j<i-1;j++) {
printf("%d\n", sourceArr[j]);
}
}
然后,如果您输入: 1 2 3 4 5 6 x(并按回车)
它会根据您的需要显示。
如果你不喜欢&#39; x&#39;你可以在行中使用它:
while (scanf("%d", &sourceArr[i++]) != EOF);
然后输入类似的内容: 12 23 345 554(点击回车)然后在窗口中按住(ctrl + z)或在unix中按住(ctrl + d)。
请参阅此主题:End of File(EOF) of Standard input stream (stdin)
ctrl + z显式使scanf返回EOF,因为控制台没有EOF,需要以这种方式发送。
答案 1 :(得分:1)
"%d"
消耗领先的空白区域,例如' '
和'\n'
,而不只是' '
。
因此,当用户输入&#34; 123 456 789&#34; 输入,再次调用scanf()
等待更多输入。它将继续等待,直到输入的非数字数据stdin
关闭或很少出现IO错误。
由于stdin
通常是缓冲的,stdin
和scanf()
在 Enter 之前看不到来自某行的任何输入按压。
while (scanf("%d", &sourceArr[i++]) == 1);
如果代码需要使用 Enter 结束输入,请使用fgets()
读取行。然后使用sscanf()
或strtol()
对其进行解析。以下内容使用"%n"
来记录char
扫描的数量。
char buf[100];
printf("\nEnter ciphertext: \n");
if (fgets(buf, sizeof buf, stdin) == NULL)
Handle_EOF();
char *p = buf;
int n;
while (sscanf(p, "%d%n", &sourceArr[i], &n) == 1) {
i++;
p += n;
}
for (int j = 0; j < i; j++) {
printf("%d\n", sourceArr[j]);
}
答案 2 :(得分:0)
scanf返回成功扫描的项目数。尝试以下代码:
#include <stdio.h>
int main()
{
int sourceArr[500];
int i = 0;
int sc =0; //scanned items
int n=3; // no of integers to be scanned
printf("\nEnter ciphertext: \n");
while(sc<n){
sc += scanf("%d",&sourceArr[i++]);
}
for (int j=0;j<i;j++) {
printf("%d\n", sourceArr[j]);
}
}