char c[] = ...
int len = ... // length of the array
int n = ...
int sum = 0;
for (int i = len - n; i < len; i++) {
sum = sum * 10 + (c[i] - '0');
}
printf("%d\n", sum);
#include <string.h>
#include <stdlib.h>
...
int extractNumber(const char* c, int n)
{
// if you're not allowed to use strlen you can
// easily roll your own
size_t lenOfAlpha = strlen(c) - n;
return atoi(c + lenOfAlpha);
}
4条答案
按热度按时间s4n0splo1#
我只知道数组的最后
n
位置是数字。一个简单的循环就足够了(假设
sum
中没有溢出):bhmjp9jg2#
你所需要的只是一个指向数字开始位置的指针,不需要中间数组。
注意,上面的函数只有在你有一个有效的 string 时才起作用。也就是说,
char
数组带有NUL
终止符。正如在注解中提到的,通过不为字符串的可打印字符加上NUL
结束符分配足够的空间,从一开始就调用undefined behavior。正如@chux在评论中指出的那样,
char c[5] = "xyz45"
实际上并没有调用undefined behavior,despite all of-fsanitize=address
's complaining。相反,它使用字符串字面量的字符替换数组,并去掉NUL
结束符。这个函数只在你有一个字符串(一个以NUL
结尾的char
数组)时才起作用,我认为这就是它的意图。要将c
初始化为字符串,必须将c
更改为或者更好的是
这两种方法都可以工作,但是第二种方法把计算长度的负担放在了编译器上,这意味着你不必计数,而且如果字符串发生变化,它更容易维护。
Demo
如果你真的只想有一个
char
数组,请参阅上面chux的答案。ergxz8rk3#
这将按照您的要求进行(输出“45”)。编译和测试的代码--请注意添加/编辑:
anauzrmj4#
混淆是否涉及C字符串。
下面显示了一个测试工具,它假设OP的“有一个字符数组”是有效的:
输出