C - 增加char中的数字

时间:2013-05-27 09:22:12

标签: c increment

是否可以在字符串中单独增加数字? 所以我想说:

char someString = "A0001";

有没有办法增加数字'0001'?使其成为A0002,A0003等?

4 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char *strinc(const char *str, int d, int min_width){
    char wk[12];//12:max length of sizeof(int)=4
    char *p;
    int len, d_len, c;

    c = len = strlen(str);
    while(isdigit(str[--c]));
    ++c;
    d += strtol(&str[c], NULL, 10);
    if(d<0) d = 0;
    d_len = sprintf(wk, "%0*d", min_width, d);
    p = malloc((c+d_len+1)*sizeof(char));
    strncpy(p, str, c);
    p[c]='\0';
    return strcat(p, wk);
}

int main(void){
    char *someString = "A0001";
    char *label_x2, *label_x3;

    label_x2 = strinc(someString, +1, 4);
    printf("%s\n", label_x2);//A0002
    label_x3 = strinc(label_x2, +1, 4);
    printf("%s\n", label_x3);//A0003
    free(label_x2);
    label_x2 = strinc("A0008", +5, 4);
    printf("%s\n", label_x2);//A0013
    free(label_x3);
    label_x3 = strinc(label_x2, -8, 4);
    printf("%s\n", label_x3);//A0005
    free(label_x2);
    free(label_x3);

    return 0;
}

答案 1 :(得分:0)

不,你不能这样做,因为它是一个常数

答案 2 :(得分:0)

简单的答案是,没有“简单”的方法来做你所要求的。您必须解析字符串,提取数字部分并解析为数字。增加数字,然后将该数字打印回字符串。

您可以尝试以下简单示例来基于... 编辑:刚看完BLUEPIXY的答案......他提出了一个很好的功能,它会为你做的,给你一个新的字符串,它没有我简单答案的宽度限制......

有一些值得注意的地方......

  1. 使用char someString[] = "A0001"; char *someString = "A0001";。原因是前者在堆栈上为字符串分配内存,后者是指向内存中字符串的指针。在后一种情况下,编译器决定的内存位置并不总是保证可写。
  2. Windows上#define的蹩脚snprintf ...不确定这是件好事。重点是使用一个安全的缓冲区写入函数,它不会溢出数组的边界。
  3. snprintf格式字符串"%0*u"格式化一个无符号整数,其最小宽度由实际整数左边的参数指定,零值告诉它在必要时用左边填充零。
  4. 如果您的数字增加到大于,在这种情况下,4位数的宽度,缓冲区将不会溢出,但您的答案将看起来错误(我没有添加任何逻辑来增加缓冲区大小)
  5. 我假设字符串的格式总是一组非数字数字,后跟一组数字,然后是一个空终止符。
  6. 现在代码......

    #include <stdio.h>
    #include <stdlib.h> 
    #include <ctype.h>
    #include <string.h>
    
    #ifdef WIN32
    #define snprintf sprintf_s
    #endif
    
    int main(int argc, char* argv[])
    {
        /* Assume that the string format is letters followed by numbers */
        /* Note use someString[] and NOT someString* */
        char someString[] = "A0001";
        char *start = someString;   
        char *end   = start + strlen(someString); /* End points to the NULL terminator */
        char *endOfParse;
        char c;
        unsigned long num;
        ptrdiff_t numDigits;
    
        /* Find first numeric value (start will point to first numeric
         * value or NULL if none found */
        while( true )
        {
            c = *start;
            if( c == '\0' || isdigit(c) )
                break;
    
            ++start;
        }
    
        if( c == '\0' )
        {
            printf("Error: didn't find any numerical characters\n");
            exit(EXIT_FAILURE);
        }
    
        /* Parse the number pointed to by "start" */
        num = strtoul(start, &endOfParse, 0);
        if(endOfParse < end )
        {
            printf("Error: Failed to parse the numerical portion of the string\n");
            exit(EXIT_FAILURE);
        }
    
    
        /* Figure out how many digits we parsed, so that we can be sure 
         * not to overflow the buffer when writing in the new number */
        numDigits = end - start;
        num = num + 1;
        snprintf(start, numDigits+1, "%0*u", numDigits, num); /* numDigits+1 for buffer size to include the null terminator */
    
        printf("Result is %s\n", someString);   
    
        return EXIT_SUCCESS;
    }
    

答案 3 :(得分:0)

你不能仅仅因为它不像你看起来那么简单。你需要先了解很多关于你想要做什么的事情。例如,您将字符串的哪一部分作为要递增的数字?

  • 仅限最后一位数字?
  • 一个数字,其后是SINGLE字母?
  • 可以跟随任意数量字母的数字?
  • 字符串中的最后一个数字,例如A33B43意味着增加33或43?

如果您对所有此类问题都有答案,则可以在函数中实现它们。之后的许多可能方法之一可以是创建一个新的子字符串,它将表示要递增的数字(此子字符串将从someString中取出)。然后使用atoi()将该字符串转换为数字,增加数字并将此递增的数字替换为someString中的字符串。(someString需要为String或char * btw)。