fgets,sscanf,并写入数组

问题描述 投票:1回答:3

这里是初学者的问题,我无法找到相关的示例。我正在使用一个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循环中吗?还是比这更复杂?

c arrays fgets
3个回答
1
投票

一个可以将fgets()ssprintf()置于一个long条件中:

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

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...
}

不检查输入会导致问题。充其量,您的代码最有可能将输入的最后一行处理两次。仅在您的退款被两次处理的情况下,您才可以这样做。最坏的情况是,您的代码可能永远不会终止,直到您的程序无聊到死,内存不足或对它失去耐心并杀死它为止。

[This]不能回答在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了解更多信息。

如果要用空白行终止输入,则不能使用sscanf()fscanf();他们通读多个空白行以寻找输入。


0
投票

使用scanf()很简单,但是放入数组...

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

sscanf

和输出

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]);
}
© www.soinside.com 2019 - 2024. All rights reserved.