gpt4 book ai didi

c - 如何从C中的字符串解析整数序列?

转载 作者:行者123 更新时间:2023-12-04 08:49:10 25 4
gpt4 key购买 nike

嗨,我对 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()因为它的副作用(分配给 valueeon ),并忽略结果 - 忽略它是必要的,因为所有可能的返回值都是有效的。条件的其他三行(逗号运算符的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com