如何读取数组中int的随机数

时间:2015-01-11 11:06:26

标签: c arrays

我想将空格分隔的整数读入一个数组,当我按回车时它应该在任何时间停止读取,如何实现这个程序的循环请帮我解决这个问题。 我尝试了下面的代码,但它确实无法工作。还有如何再次阅读。

#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;
}

提前致谢

4 个答案:

答案 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;
}