在测试条件下使用scanf

时间:2014-12-21 20:13:57

标签: c scanf function-calls

我想存储一系列整数,直到我按下数组中的输入。我如何实现

输入: 1(标签空间)2(标签空间)3(标签空间)4(标签空间)输入

我试过这个

#include<stdio.h>
main()
{
int i,j,c,d;
int a[5];
for(i=0;i<2;i++){
        j=0;
    while((d=scanf("%d",&c))==1){
         a[j]=c;
         j=j+1;
    }
 }
}

我不知道scanf如何工作并使用scanf返回值。请解释如何使用scanf并且

来存储此输入

2)scanf中还可以使用%d?

我有一个包含200行的文件,其中包含这样的数字 (注意:每行有不同数量的值,但所有数字都小于200)

1\t2\t3\t4\t5\t
2\t3\t4\t5\t6\t7\t8\t
11\t12\t13\t
.
.
200

...所以我必须将其存储为邻接列表表示

2 个答案:

答案 0 :(得分:1)

问题的第一部分。 scanf()返回成功读取的元素数,但这里没用,你可以只扫描一个循环,当你按回车键时,scanf()会在一行中选择你的整数。

   #include <stdio.h>

int main(void) {
    int a[5];
    int i, n;
    for(i=0;i<5;i++)
    {
       if(scanf("%d",&a[i]) != 1)
       {
          printf("Value not read correctly\n");
          break;
       }
    }
    n = i;
    for(i=0;i<n;i++)
        printf("%d\n",a[i]);
    return 0;
}

对于第二个问题,你必须做一些事情

1.使用fgets()

从您的文件中读取一行

2.使用strtok()打开您的行,并使用制表符作为分隔符。

3.现在使用atoi()

将每个标记转换为整数

4.现在用整数做你想做的事。即创建一个节点将您的整数添加到节点

答案 1 :(得分:0)

让我们对每行的宽度做出一些合理的假设 这些假设对简单代码很有用,但一般不需要。

#define LINE_WIDTH_MAX 1000
#define INTS_PER_LINE_MAX 100
#define ROWS_PER_FILE (200 /* given by OP */)

fgets()读取每一行,然后扫描。可以使用strtol()sscanf()或各种方法。

此方法使用sscanf()"%n"来确定下一个数字可能会跟随的时间。

int row;
for (row = 0; row < ROWS_PER_FILE; row++) {
  char buf[LINE_WIDTH_MAX + 2];
  if (fgets(buf, sizeof buf, stdin) == NULL) {
    break;  // Handle EOF or IO error
  }
  int num[INTS_PER_LINE_MAX];
  char *p = buf;
  for (int i = 0; i<INTS_PER_LINE_MAX; i++) {
    int n = 0;
    if (1 != sscanf(p, "%d %n", &num[i], &n)) {
      break;
    }
    p += n;
  }
  if (*p) Handle_GarbageInLIne();

  // do something with the `i` numbers

}

注意:

建议永远不要使用scanf() /