如何使用3-2-2-2节奏拆分9个字符的数组,并将其转换为4个不同的int变量?
示例:
char s[9] = {'9', '8', '7', '6', '5', '4', '3', '2', '1'}
a=987;
b=65;
c=43;
d=21;
发布于 2021-02-21 22:00:40
对于此任务,您可以谨慎使用sscanf()
:
#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()
执行,除非已知输入具有正确的内容。
或者,如果您知道输入只包含数字,则可以使用一个简单的函数动态解析它们:
#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;
}
发布于 2021-02-21 22:05:02
只要在所有转换说明符中提供了最大字段宽度,这样sscanf
就不会试图在数组末尾使用数据,就可以使用sscanf
来解析没有字符串终止符的字符数组。例如:
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
占用前导空格。如果字符数据(不是字符串,因为它没有终止)来自外部来源,那么您确实应该在解析之前验证其内容。
https://stackoverflow.com/questions/66302898
复制相似问题