我想将空格分隔的整数读入一个数组,当我按回车时它应该在任何时间停止读取,如何实现这个程序的循环请帮我解决这个问题。 我尝试了下面的代码,但它确实无法工作。还有如何再次阅读。
#include<stdio.h>
int main()
{
int arr[30];
int j=0;
while(1)
{
int d;
scanf("%d",&d);
arr[j++]=d;
if(d=='\n')break;
}
return 0;
}
提前致谢
答案 0 :(得分:3)
您的问题是scanf
会在查找下一个项目时自动跳过所有空格(空格,制表符,换行符)。您可以通过专门要求读取换行符来区分换行符和其他空格:
int main() {
int arr[30]; // results array
int cnt = 0; // number of results
while (1) {
// in the scanf format string below
// %1[\n] asks for a 1-character string containing a newline
char tmp[2]; // buffer for the newline
int res = scanf("%d%1[\n]", &arr[cnt], tmp);
if (res == 0) {
// did not even get the integer
// handle input error here
break;
}
if (res == 1) {
// got the integer, but no newline
// go on to read the next integer
++cnt;
}
if (res == 2) {
// got both the integer and newline
// all done, drop out
++cnt;
break;
}
}
printf("got %d integers\n", cnt);
return 0;
}
这种方法的问题在于它只识别整数后面的换行符,并且会静默跳过只包含空格的行(并从下一行开始读取整数)。如果这是不可接受的,那么我认为最简单的解决方案是将整行读入缓冲区并解析该缓冲区中的整数:
int main() {
int arr[30]; // results array
int cnt = 0; // number of results
char buf[1000]; // buffer for the whole line
if (fgets(buf, sizeof(buf), stdin) == NULL) {
// handle input error here
} else {
int pos = 0; // current position in buffer
// in the scanf format string below
// %n asks for number of characters used by sscanf
int num;
while (sscanf(buf + pos, "%d%n", &arr[cnt], &num) == 1) {
pos += num; // advance position in buffer
cnt += 1; // advance position in results
}
// check here that all of the buffer has been used
// that is, that there was nothing else but integers on the line
}
printf("got %d integers\n", cnt);
return 0;
}
另请注意,当线路上有超过30个整数时,上述两种解决方案都将覆盖结果数组。如果输入行长于适合缓冲区的输入行,则第二个解决方案也会使某些输入行未读。根据输入的来源,这些都可能是在实际使用代码之前需要修复的问题。
答案 1 :(得分:0)
方法1:使用scanf()的返回值并在完成后输入一个字符(你的问题不需要这个,直到换行不起作用,但这是其中一种方法)
int d;
while(scanf("%d",&d) == 1)
{
arr[i] = d;
i++;
}
方法2:使用fgets()
读取该行并使用strok()
和atoi()
解析该行,如图所示
char arr[100];
fgets(arr,sizeof(arr),stdin);
char *p =strtok(arr, " ");
while(p != NULL)
{
int d = atoi(p);
arr[i++] = d;
p = strtok(NULL," ");
}
答案 2 :(得分:0)
一种好方法是使用getchar()
和一个字符通过检查ASCII值来检查程序中的ENTER
while(1)
{
char d;
d=getchar();
if(d==13 || d==10) break;
arr[j++]=d-'0';
}
只要按下回车键,它就会终止。 关于此So post
已经提供了更多讨论答案 3 :(得分:0)
scanf("%d"...
首先消耗领先的空白区域。要检测'\n'
,代码应在调用scanf("%d"...
之前扫描前导空格。
要在发生'\n'
时终止输入,首先开始寻找它。建议使用getchar()
。
以下代码处理OP目标并且:
*以\n
开头的行
*超过N int
的行数
* EOF和非数字输入
#include<ctype.h>
#include<stdio.h>
#define N (30)
int main(void) {
int arr[N];
int j = 0;
for (j = 0; j < N; j++) { // Don't read too many
int ch;
while ((ch = getchar()) != '\n' && isspace(ch));
if (ch == '\n') {
break;
}
// put back ch
ungetc(ch, stdin);
int cnt = scanf("%d", &arr[j]);
if (cnt != 1) {
break; // Stop if input is EOF or non-numeric
}
}
printf("%d\n", j);
return 0;
}