在C中扫描值,直到点击新行字符,' \ n'

时间:2015-06-07 11:13:04

标签: c arrays algorithm scanf getchar

我怎样才能scanf()在输入数组之前输入数组的整数值。

我相信我可以使用getchar() != '\n'

但我如何循环线?

假设我的输入为20 21 2 12 2。我想要一个包含所有这些输入的数组。 我可以使用哪些函数来扫描它们。

2 个答案:

答案 0 :(得分:3)

  1. 您正在尝试将整数作为字符读取,因此一旦读取,您需要将其转换为整数。
  2. 使用fgets()将行读入缓冲区,然后解析输入缓冲区以获取整数。
  3. 将整数存储到数组中。
  4. 代码看起来像

    char buf[300];
    int a[5],i=0;
    fgets(buf,sizeof(buf),stdin);
    char *p = strtok(buf," ");
    while(p != NULL)
    {
      char *endptr;
      a[i] = strtol(p,&endptr,10);
      if ((*endptr != '\0') && (isspace(*endptr) == 0))
          printf("warning: invalid value detected\n");
      else
          i++;
      p = strtok(NULL," ");
    }
    

    您可以使用替代strtol()代替atoi()将字符串转换为整数。

    PS:你的buf应足够大以容纳整条线。 fgets()读到换行符。

答案 1 :(得分:0)

如果你使用getchar(),你会逐个获得数字,所以你需要 将它们首先存储在缓冲区中,当空白区域出现时, 将这些数字转换为数字,并将其存储到数组中。

这是我为您制作的代码的解释。

  • 1st if语句:如果获得的字符是数字,则将其存储在buf
  • 第二个if语句:如果获得的字符是空格或EOL且buf中至少存储了1位数字,则将数字转换为数字并将其存储在数组a中。
  • 3rd if语句:如果获得的字符不是数字或空格或EOL,则警告用户。
  • 第4个if语句:如果获得的字符是EOL,则结束循环。

以下代码运行正常。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(){
#define BUFSIZE 50
#define ARRAYSIZE 5
    int i,k,a[ARRAYSIZE];
    char c,buf[BUFSIZE];

    for(i=0,k=0;(i<BUFSIZE)&&(k<ARRAYSIZE);){
        c=getchar();
        if(isdigit(c)){
            buf[i++] = c;
        }else if((i>0) && (c==' ' || c=='\n')){
            buf[i] = '\0';
            a[k++] = atoi(buf);
            i=0;
        }else if(!(c==' ' || c=='\n')){
            printf("warning : invalid value %c is detected\n",c);
            i=0;
        }
        if(c=='\n'){
            break;
        }
    }
    printf("input :");
    for(i=0;i<ARRAYSIZE;i++){
        printf("%d, ",a[i]);
    }
    printf("\n");
}