晚上好,
我在分配作业时遇到问题。
基本上,我们需要编写一个程序来计算给定stdin
. 数据只能通过其进入程序stdin
,无论是通过一个echo
还是一个< file.txt
。数据流永远不会超过 80 个字符(它们可以是数字,也可以不是数字)。
我在程序中使用的函数是read()
,strotol()
和strtok()
, “不相关”的代码流程如下:
- 用于
malloc
分配 80 个初始字节的内存。 int
通过read()
读取的字符数(我相信,最后一个)存储在 中\0
。- 重新分配内存
realloc()
以节省尽可能多的内存(我知道在这种情况下这很简单,但是哦……)。
现在是棘手的一点:
- 由于数据必须用空格分隔,因此要检查的最大项目数最多为:
(n/2)+1
,其中n
是在上点 nº 2 处读取的字符数。 - 创建一个数组,
long
其最大大小为在点 nº 1 中获得的数字。 - 填充
numbers[0]
结果:strtol(strtok(line, delim), &end, 10)
。 添加
1
到counter
并进入一个while
循环:while((numbers[counter] = strtol(strtok(NULL, delim), &end, 10)) != NULL) { if(!*end) { // Check whether it's 0, 1, negative, prime or extract its factors } else { fprintf(stderr, "\"%s\" is not a non-negative integer", end) } counter++; }
现在,这里有一些输入和它们的输出:
输入:echo 1 2 3 4 5 6 7 8 9 10 | ./factors
输出:
1
2
3
2 2
5
2 3
7
2 2 2
3 3
2 5
Segmentation Fault (core dumped).
Input./factors < integers.txt
其中 integers 包含一列整数。
输出:
所有整数都被分解得很好,最后打印出:
Segmentation Fault (core dumped).
输入:echo abc 12 13 14 15 | ./factors
输出:
"abc" is not a non-negative integer
13
2 7
3 5
Segmentation Fault (core dumped).
输入:echo -1 -2 -3 -4 -5 | ./factors
输出:
"-1" is not a non-negative integer
"-2" is not a non-negative integer
"-3" is not a non-negative integer
"-4" is not a non-negative integer
"-5" is not a non-negative integer
输入:echo abc abc abc | ./factors
输出:
"abc" is not a non-negative integer
(并且不继续检查)。
输入:echo 3 4 0 6 7 | ./factors
输出:
3
2 2
(并且不继续检查)。
据我所知,当它遇到一个0
以上的非或基本上在基于健康的数据流integer
的末尾的实例时,它会失败。integer
知道我该如何解决这个问题,为什么它会如此明显地随机失败?
我应该让你知道我是 C 的新手...
非常感谢您。
==================================================== ==
EDIT1:根据请求,这里是生成的代码片段numbers[]
,并从中读取stdin
:
char *line;
char *end;
char *delim = " \n";
int charsread, counter;
line = malloc(80);
charsread = read(0, line, 81);
if (charsread == 0) {
return EX_OK;
}
realloc(line, charsread);
maxelem = (charsread / 2) + 1;
long numbers[maxelem];
numbers[0] = strtol(strtok(line, delim), &end, 10);
if (!*end) {
zeroone(numbers[0]);
}
else {
fprintf(stderr, "\"%s\" is not a non-negative integer\n", end);
}
counter = 1;
while [...]