1

是否可以在字符串中单独增加一个数字?所以假设我有:

char someString = "A0001";

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

4

4 回答 4

2
#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;
}
于 2013-05-27T09:58:08.937 回答
0

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

您可以尝试下面的简单示例来基于...我的简单回答...

有几点值得注意...

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

现在代码...

#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;
}
于 2013-05-27T09:59:54.307 回答
0

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

  • 只有最后一个数字?
  • 一个数字后跟一个字母?
  • 一个数字后面可以跟任意数量的字母吗?
  • 字符串中的最后一个数字,例如 A33B43 意味着增加 33 或 43?

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

于 2013-05-27T10:25:14.917 回答
0

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

于 2013-05-27T09:28:25.390 回答