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