1

初学者问题在这里,我无法找到相关的示例。我正在开发一个 C 程序,该程序将使用 fgets 和 sscanf 从标准输入获取整数输入,然后将其写入数组。但是,我不确定如何让 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 循环中吗?还是比这更复杂?

4

3 回答 3

2

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

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

如果每行需要多个数字,请查看如何sscanf()在循环中使用以获取更多信息。

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

于 2013-11-07T20:33:19.080 回答
1

One can put fgets()& ssprintf()in one 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;
}
于 2013-11-08T03:42:26.323 回答
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
于 2020-03-12T08:36:35.390 回答