我一直在尝试提出读取输入的解决方案,其中包含字符串,然后是带有数字数组的括号(我不知道将输入多少个数字。
输入可能如下所示:
sacrifice (1, 2, 4, 2)
我想知道是否可以用scanf来实现。我一直在寻找不同的函数,例如 getline、sscanf、fgets 等。但我无法想出解决方案。
我的代码如下所示:
scanf("%[^(]", command);
while ( ( c = getchar() ) != ')' )
{
scanf("%d", weights[pos]);
pos++;
}
它应该读取字符串,直到找到括号,然后我尝试将数字加载到数组中,只要它没有到达“)”。但似乎不起作用。
scanf 是否可以实现这一目标?如果没有的话,有人能给我指出更好的方向吗?
最佳答案
我认为从标准输入读取完整的行,然后使用 strtok
或 strcspn
手动解析它会更简单。可以做类似下面的事情。
免责声明:这只是一些示例代码,并不处理所有可能的输入,并且会因无效输入而崩溃,它只是为了让您了解如何做到这一点。如果你想这样做,你就必须处理各种错误情况,例如:
- 检查
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/