在C中从char数组中提取字符

qni6mghb  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(124)

我试图从char数组中提取最后两个字符,但无法完成。阵法会交给我,我无法控制它。我只知道数组的最后n位置是数字。在以下情况下n=2

char c[5] = "xyz45"
char d[2];
d[0] = c[3];
d[1] = c[4];
int e = atoi(d);

显然,所需的e的值是45。有办法解决吗?(上面的方法是关于如何在python中做到这一点的代表性方法。我正在寻找一种优雅的方式来做到这一点。)

s4n0splo

s4n0splo1#

我只知道数组的最后n位置是数字。
一个简单的循环就足够了(假设sum中没有溢出):

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);
bhmjp9jg

bhmjp9jg2#

你所需要的只是一个指向数字开始位置的指针,不需要中间数组。

#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);
}

注意,上面的函数只有在你有一个有效的 string 时才起作用。也就是说,char数组带有NUL终止符。正如在注解中提到的,通过不为字符串的可打印字符加上NUL结束符分配足够的空间,从一开始就调用undefined behavior
正如@chux在评论中指出的那样,char c[5] = "xyz45"实际上并没有调用undefined behaviordespite all of -fsanitize=address 's complaining。相反,它使用字符串字面量的字符替换数组,并去掉NUL结束符。这个函数只在你有一个字符串(一个以NUL结尾的char数组)时才起作用,我认为这就是它的意图。要将c初始化为字符串,必须将c更改为

char c[6] = "xyz45";

或者更好的是

char c[] = "xyz45";

这两种方法都可以工作,但是第二种方法把计算长度的负担放在了编译器上,这意味着你不必计数,而且如果字符串发生变化,它更容易维护。
Demo
如果你真的只想有一个char数组,请参阅上面chux的答案。

ergxz8rk

ergxz8rk3#

这将按照您的要求进行(输出“45”)。编译和测试的代码--请注意添加/编辑:

#include <stdio.h>
#include <stdlib.h> /* atoi() */

int main()
{
    char c[6] = "12345";  /* Size 6 -- provide room for terminating NUL*/
    char d[3];  /* Size 3 -- again, provide room for terminating NUL*/

    d[0] = c[3];
    d[1] = c[4];
    d[2] = '\0';  /* Add a teminating NUL (strings need this)*/

    printf("%d\n", atoi(d));  /* Output: "45" */

    /* This also Outputs "45"  Why is that?  (Left as an exercise for the OP)*/
    printf("%d\n", atoi(&c[3]));  
    
    return 0;
}
anauzrmj

anauzrmj4#

混淆是否涉及C字符串。
下面显示了一个测试工具,它假设OP的“有一个字符数组”是有效的:

int extract( char *str, int len, int n ) {
    int v = 0;
    char *cp = str + len;

    for( int dec = 1; n-- && --cp >= str && isdigit( *cp ); dec *= 10 )
        v += (*cp - '0') * dec;

    return v;
}

int main( void ) {
    int i;

    char arr[][9] = {
        { 'f', 'o', 'o', 'b', 'a', 'r', '1', '2', '3' },
        { 'f', 'o', 'o', 'b', 'a', 'r', 'r', '4', '2' },
        { 'f', 'o', 'o', 'b', 'a', 'r', '5', '6', '7' },
    };

    for( i = 0; i < sizeof arr/sizeof arr[0]; i++ )
        printf( "%d: %d\n", i + 1, extract( arr[i], sizeof arr[0], 3 ) );

    return 0;
}

输出

1: 123
2: 42
3: 567

相关问题