gpt4 book ai didi

c - 重温 C 中的解析输入

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:41 27 4
gpt4 key购买 nike

我有一个 "a b.c d.e" 形式的输入(不包括引号)我想解析成整数值,如 a1=a, a2=b, a3=c,..等等。但诀窍是 "." 之后的值也可能会丢失,因此,"a b d.e""a b c""a b.c d" 是有效输入。但是 "a b.d.e" 无效,因为在 "b" 之后有一个 "." 但后面没有数字。假设数字即。 "a", "b"等为大于0小于1000的整数

我只能想想做起来的艰辛方法。试过这个 ->

scanf("%d %2d[^. ].%2d[^. ] %2d[^. ].%2d[^\n]",&a,&b,&c,&d,&e);

但是没有用。感谢使用 scanf() 参数技巧解析它的任何帮助。

最佳答案

如果我理解您对我评论的回答,那么在这种情况下,我认为您无法将输入硬塞进 scanf 格式字符串 并处理变化你想处理。然而,在这种情况下,您可以退回到久经考验的真实方法,解析任何内容,strtol 的帮助下沿着字符串移动指针

strtol 提供了一个结束指针,它被设置为输入字符串中有效转换为 long 后的下一个字符。因此,如果您正在处理一个复杂的输入字符串,您可以从 strtol (p, &ep, 10) 开始,其中 p 是指向您的字符串的指针,ep 将设置为第一个数字转换后字符串中的下一个字符。 (在您的情况下是 '.'' ')。如果下一个字符是'.',您可以对后面的字符进行进一步的测试,并在逐个收集值时确定您的输入字符串是否有效.

在您测试了所需的条件并将 ep 提前指向下一个要转换的有效数字的开头之后,您只需设置 p = ep; 并重复直到您已填写 a、b 和 c 或遇到错误情况。

当使用 strtol 时,除了检查 errno 之外,您还可以使用几个额外的验证,但这对本例来说已经足够了。请参阅 man strtol 了解剩余的验证。

如果我正确理解了您的逻辑,您可以执行类似以下操作:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define MAXC 32

int main (void) {

char buf[MAXC] = "", *p = buf, *ep = NULL;
int a = 0, b = 0, c = 0, tmp = 0;

printf ("enter values: ");
if (!fgets (buf, MAXC, stdin))
return 1;

for (;;) {
tmp = strtol (p, &ep, 10);
if (errno) { /* minimal conversion validation */
fprintf (stderr, "error: failed conversion.\n");
return 1;
}
if (!a) /* handle a */
a = tmp;
else if (!b) { /* handle b */
if (*ep && *ep == '.' && *(ep + 1) && *(ep + 1) == ' ') {
fprintf (stderr, "error: invalid input = '.' alone.\n");
return 1;
}
b = tmp;
if (*ep && *ep == '.' && *(ep + 1) &&
'0' <= *(ep + 1) && *(ep + 1) <= '9')
ep++;
else
while (*ep && (*ep < '0' || '9' < *ep))
ep++;
if (!*ep) {
fprintf (stderr, "error: invalid input - no 'c'.\n");
return 1;
}
}
else if (!c) { /* handle c */
if (*ep && *ep == '.' && *(ep + 1) &&
(*(ep + 1) == ' ' || *(ep + 1) == '\n')) {
fprintf (stderr, "error: invalid input = '.' alone.\n");
return 1;
}
c = tmp;
break;
}
p = ep;
}

printf ("a : %d\nb : %d\nc : %d\n", a, b, c);

return 0;
}

示例使用/输出

$ ./bin/triplet
enter values: 1 2.3 4.5
a : 1
b : 2
c : 3

$ ./bin/triplet
enter values: 1 2 3.4
a : 1
b : 2
c : 3

$ ./bin/triplet
enter values: 1 2 3
a : 1
b : 2
c : 3

$ ./bin/triplet
enter values: 1 2.3 4
a : 1
b : 2
c : 3

$ ./bin/triplet
enter values: 1 2. 3.4
error: invalid input = '.' alone.

检查一下,如果我误解了您的评论,请告诉我。如果没有,请永远记住,您可以通过简单地沿着字符串向下移动一个指针(或一对指针)来解析任何内容

关于c - 重温 C 中的解析输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45251003/

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