fgets,sscanf和写入数组

时间:2013-11-07 20:28:15

标签: c arrays fgets

这里的初学者问题,我无法找到相关的例子。我正在研究一个C程序,它将使用fgets和sscanf从stdin获取整数输入,然后将其写入数组。但是,我不确定如何使fgets写入数组。

#define MAXINT 512
char input[MAXINT]

int main(void)
{
    int i;
    int j;
    int count=0;
    int retval;

    while (1==1) {
        fgets(input, MAXINT[count], stdin);
        retval = sscanf(input, "%d", &i);

        if (retval == 1) {
            count = count++;
            }
        else
            if (retval != 1) {
                break;
                }
        }

我会简单地将fgets放入for循环吗?还是比这更复杂?

3 个答案:

答案 0 :(得分:1)

fgets()读入一个字符串(char数组),而不是int数组。

你的循环应该是:

char line[4096];

while (fgets(line, sizeof(line), stdin) != 0)
{
    ...code using sscanf() iteratively to read into the array of int...
}

不检查输入会导致问题。充其量,您的代码最有可能处理最后一行输入两次。如果这意味着我的退款会被处理两次,那么您才被允许这样做。在最坏的情况下,您的代码可能永远不会终止,直到您的程序无聊或内存耗尽,或者您对它失去耐心并将其杀死。

  

[这]没有回答我如何在while循环中写入数组的问题。我是否会将sscanf函数括在for循环中,无论输入的数字是多少?每按一次Enter,我会设置一些东西吗?

假设每行只有一个数字,那么循环体中的代码很简单:

char line[4096];
int  array[1024];
int  i = 0;

while (fgets(line, sizeof(line), stdin) != 0)
{
    if (i >= 1024)
        break;  // ...too many numbers for array...
    if (sscanf(line, "%d", &array[i++]) != 1)
        ...report error and return/exit...
}

请注意,如果同一行上有垃圾(其他数字,非数字),此代码将不会注意到;它只是抓住第一个数字(如果有的话)并忽略其余的数字。

如果每行需要多个号码,请查看How to use sscanf() in loops以获取更多信息。

如果您想要一个空行来终止输入,那么使用fscanf()scanf()不是一个选项;他们阅读了多个空白行,寻找输入。

答案 1 :(得分:1)

可以fgets()&在{em>长条件中ssprintf()

#define MAXINT 512 /* suggest alternate name like Array_Size */
int input[MAXINT];
char buf[100];
int count = 0;

while ((NULL != fgets(buf, sizeof buf, stdin)) && (1 == sscanf(buf,"%d",&input[count]))) {
  if (++count >= MAXINT) break;
}

......或者更友好的东西:

// While stdin not closed and input is more than an "Enter" ...
while ((NULL != fgets(buf, sizeof buf, stdin)) && (buf[0] != '\n')) {
  if (1 != sscanf(buf,"%d",&input[count])) {
    puts("Input was not an integer, try again.\n");
    continue;
  }
  if (++count >= MAXINT) break;
}

答案 2 :(得分:0)

使用sscanf很简单,但是放入数组中...

C难以动态初始化数组的大小,这有时是大屠杀的完美主义者。

int main()
{
int total_n;
int n;
int i;
char *s = "yourpattern1yourpattern2yourpattern23";
printf("your string => %s\n", s);
int array[129] = {0};//some big enough number to hold the match
int count = 0;
        while (1 == sscanf(s + total_n, "%*[^0123456789]%d%n", &i, &n))
        {
            total_n += n;
            printf("your match => %d\n", i);
            array[count] = i;
            count++;
        }

printf("your array => \n");
        for (i=0;i<count;i++)
        printf("array[i] => %d\n", array[i]);
}

和输出

[root@localhost ~]# ./a.out
your string => yourpattern1yourpattern2yourpattern23
your match => 1
your match => 2
your match => 23
your array =>
array[i] => 1
array[i] => 2
array[i] => 23