作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嗨,我对 C 很陌生,我遇到了一个问题,我对如何将字符串行解析为整数感到困惑。到目前为止,我的方法只是将第一个字符串解析为整数。所以如果我的输入是 10 20 30
它只会取第一个字符串并将其解析为整数。我正在寻找有关如何提出可以读取所有行并使用 getline()
将其全部解析为整数值的解决方案的想法。 .
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *line = NULL;
size_t len = 0;
int val =0;
int sum = 0;
while (getline(&line, &len, stdin) != EOF) {
printf("Line input : %s\n", line);
//printf("Test %d", val);
//parse char into integer
val = atoi(line);
printf("Parsed integer: %d\n", val);
}
free(line);
return 0;
}
最佳答案
正如我在评论中指出的,最好使用 strtol()
(或 strtoX()
函数系列的其他成员之一)将字符串转换为整数。这是关注 Correct usage of strtol()
的代码.
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *line = NULL;
size_t len = 0;
while (getline(&line, &len, stdin) != -1)
{
printf("Line input : [%s]\n", line);
int val = atoi(line);
printf("Parsed integer: %d\n", val);
char *start = line;
char *eon;
long value;
errno = 0;
while ((value = strtol(start, &eon, 0)),
eon != start &&
!((errno == EINVAL && value == 0) ||
(errno == ERANGE && (value == LONG_MIN || value == LONG_MAX))))
{
printf("%ld\n", value);
start = eon;
errno = 0;
}
putchar('\n');
}
free(line);
return 0;
}
问题中使用 POSIX 读取行的代码
getline()
几乎是正确的;将指向空指针的指针传递给函数并将指针传递给 0 是合法的。但是,从技术上讲,
getline()
返回
-1
而不是
EOF
,尽管很少(如果有)系统存在差异。尽管如此,标准 C 允许
EOF
为任何负值 — 不需要为
-1
.
strtol()
的 Linux 和 macOS 手册页状态“返回 0 并将
errno
设置为
EINVAL
”当它无法转换字符串时,C 标准不需要
errno
为此设置。但是,当转换失败时,
eon
将设置为
start
——这是由标准保证的。因此,对于
EINVAL
的测试部分还有争论的余地。是多余的。
while
循环使用逗号运算符来调用
strtol()
因为它的副作用(分配给
value
和
eon
),并忽略结果 - 忽略它是必要的,因为所有可能的返回值都是有效的。条件的其他三行(逗号运算符的 RHS)评估转换是否成功。这避免了将调用写入
strtol()
两次。这可能是 DRY(不要重复自己)编程的一个极端情况。
rn89
):
$ rn89
1 2 4 5 5 6
Line input : [ 1 2 4 5 5 6
]
Parsed integer: 1
1
2
4
5
5
6
232443 432435423 12312 1232413r2
Line input : [232443 432435423 12312 1232413r2
]
Parsed integer: 232443
232443
432435423
12312
1232413
324d
Line input : [324d
]
Parsed integer: 324
324
$
关于c - 如何从C中的字符串解析整数序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64163657/
我是一名优秀的程序员,十分优秀!