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

标签 c arrays string scanf

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

输入可能如下所示:

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/

相关文章:

javascript - 在 JavaScript 中浏览 SQL 对象

arrays - 在 swift 中使用通用数组

php - 上传时在数据库中插入文件名而不是 CakePHP 中的数组

sql - Heroku Postgres 上 SQL 查询中的字符串比较

c - 当未连接的代码行取消注释时,为什么此 C 程序会检测到字符串中的两个 '\0' 字符?

c - 通过动态分配的结构变量获取用户输入的字符串

c - 对如何完成计划感到不知所措

c - 从字符串元素中取值并将取值与两位数相加

java - 在 Java 中格式化 JSONArray

string - 搜索满足某些条件的最小字符串