首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用固定节奏拆分数组并将其转换为int

使用固定节奏拆分数组并将其转换为int
EN

Stack Overflow用户
提问于 2021-02-21 21:40:55
回答 2查看 67关注 0票数 2

如何使用3-2-2-2节奏拆分9个字符的数组,并将其转换为4个不同的int变量?

示例:

代码语言:javascript
运行
复制
char s[9] = {'9', '8', '7', '6', '5', '4', '3', '2', '1'}
a=987;
b=65;
c=43;
d=21;
EN

回答 2

Stack Overflow用户

发布于 2021-02-21 22:00:40

对于此任务,您可以谨慎使用sscanf()

代码语言:javascript
运行
复制
#include <stdio.h>

int main() {
    char s[9] = { '9', '8', '7', '6', '5', '4', '3', '2', '1' };
    int a, b, c, d;

    {  // check that the input data starts with 9 digits
        int n = 0;
        sscanf(s, "%9*[0-9]%n", &n);
        if (n != 9)
            return 1;
    }
    // parse the input data into 4 integers composed of 3, 2, 2 and 2 digits
    if (sscanf(s, "%3d%2d%2d%2d", &a, &b, &c, &d) == 4) {
        printf("%d, %d, %d, %d\n", a, b, c, d);
    }
    return 0;
}

输出:987, 65, 43, 21

scanf()中的转换说明符支持一个数字参数,该参数指定要从源使用的最大字符数:%3d表示转换最多使用3个字符的十进制整数。4个连续的转换,每个指定的长度为3或2个字符,精确地实现了您的目标。但是请注意,每次转换之前消耗的初始空白不会被计算在内,因此您必须确保输入字符串以9位数字开头才能使上面的代码工作,这可以使用另一个sscanf()执行,除非已知输入具有正确的内容。

或者,如果您知道输入只包含数字,则可以使用一个简单的函数动态解析它们:

代码语言:javascript
运行
复制
#include <stdio.h>

int get_int(char **pp, int n) {
    int num = 0;
    while (n --> 0) {
        num = num * 10 + (*(*pp)++ - '0');
    }
    return num;
}

int main() {
    char s[9] = { '9', '8', '7', '6', '5', '4', '3', '2', '1' };
    char *p = s;
    int a = get_int(&p, 3);
    int b = get_int(&p, 2);
    int c = get_int(&p, 2);
    int d = get_int(&p, 2);
    printf("%d, %d, %d, %d\n", a, b, c, d);
    return 0;
}
票数 3
EN

Stack Overflow用户

发布于 2021-02-21 22:05:02

只要在所有转换说明符中提供了最大字段宽度,这样sscanf就不会试图在数组末尾使用数据,就可以使用sscanf来解析没有字符串终止符的字符数组。例如:

代码语言:javascript
运行
复制
char s[9] = {'9', '8', '7', '6', '5', '4', '3', '2', '1'}
int a, b, c, d;

sscanf(s, "%3d%2d%2d%2d", &a, &b, &c, &d);

请注意,字段宽度本身并不足以确保数组边界不会溢出,因为%d指令也会导致(s)scanf占用前导空格。如果字符数据(不是字符串,因为它没有终止)来自外部来源,那么您确实应该在解析之前验证其内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66302898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档