gpt4 book ai didi

c - scanf用于读取括号中的字符串和int数组

转载 作者:行者123 更新时间:2023-11-30 16:53:06 24 4
gpt4 key购买 nike

我一直在尝试提出读取输入的解决方案,其中包含字符串,然后是带有数字数组的括号(我不知道将输入多少个数字。

输入可能如下所示:

sacrifice (1, 2, 4, 2)

我想知道是否可以用scanf来实现。我一直在寻找不同的函数,例如 getline、sscanf、fgets 等。但我无法想出解决方案。

我的代码如下所示:

    scanf("%[^(]", command);
while ( ( c = getchar() ) != ')' )
{
scanf("%d", weights[pos]);
pos++;
}

它应该读取字符串,直到找到括号,然后我尝试将数字加载到数组中,只要它没有到达“)”。但似乎不起作用。

scanf 是否可以实现这一目标?如果没有的话,有人能给我指出更好的方向吗?

最佳答案

我认为从标准输入读取完整的行,然后使用 strtokstrcspn 手动解析它会更简单。可以做类似下面的事情。

免责声明:这只是一些示例代码,并不处理所有可能的输入,并且会因无效输入而崩溃,它只是为了让您了解如何做到这一点。如果你想这样做,你就必须处理各种错误情况,例如:

  • 检查malloc/getline/realloc的返回值
  • 使用 strtol(允许错误检查)等更好的函数代替 atoi
  • 处理输入中的空格
  • 处理不包含任何括号的输入

这些是您必须考虑的许多事情中的一些。

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

static int *parse_numbers(char *numstr, size_t *size)
{
char *p;
char *s = numstr;
char *last;
size_t array_size = 10;
int *numbers = malloc(sizeof(int) * array_size);
size_t offset = 0;
for (p = strtok_r(s, ",", &last); p; p = strtok_r(NULL, ",", &last)) {
if (offset == array_size) {
array_size *= 2;
numbers = realloc(numbers, sizeof(int) * array_size);
//TODO do error check
}
numbers[offset++] = atoi(p); //strtol would be a better choice
}
*size = offset;
return numbers;
}

int main()
{
char *s = NULL;
char *p;
char *last;
int i = 0;
int *numbers;
size_t size;
size_t linesize = 0;

getline(&s, &linesize, stdin);
for (p = strtok_r(s, "(", &last); p; p = strtok_r(NULL, "(", &last)) {
if (i++ == 0) {
//This is the part of the string before '('
cmd = p;
} else {
// This is the part of the string after '('
numbers = parse_numbers(p, &size);
}
}
for (i = 0; i < size; i++) {
printf("%d\n", numbers[i]);
}
free(numbers);
free(s);
return 0;
}

关于c - scanf用于读取括号中的字符串和int数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41019229/

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