是否可以在字符串中单独增加一个数字?所以假设我有:
char someString = "A0001";
有没有办法增加数字'0001'?使其成为 A0002、A0003 等?
#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;
}
简单的答案是没有“简单”的方法来做你所要求的。您必须解析字符串,提取数字部分并解析为数字。增加数字,然后将该数字打印回您的字符串。
您可以尝试下面的简单示例来基于...我的简单回答...
有几点值得注意...
char someString[] = "A0001";
而不用 char *someString = "A0001";
。原因是前者在栈上为字符串分配内存,后者是指向内存中字符串的指针。在后一种情况下,编译器决定的内存位置并不总是保证是可写的。#define
在 Windows上很糟糕snprintf
......不确定这是一件好事。关键是真正使用不会溢出数组边界的安全缓冲区写入函数。snprintf
格式字符串格式化一个无符号整数,其"%0*u"
最小宽度由实际整数左侧的参数指定,零告诉它在必要时用零填充。现在代码...
#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;
}
你不能仅仅因为它不像你看起来那样容易加工。关于你首先要做什么,你需要了解很多事情。例如,您将字符串的哪一部分作为要递增的数字?
当你对所有这些问题都有答案时,你可以在一个函数中实现它们。此后许多可能的方法之一是创建一个新的子字符串,该子字符串将表示要递增的数字(此子字符串将从您的 someString 中取出)。然后使用 atoi() 将该字符串转换为数字,增加数字并将这个增加的数字替换为 someString 中的字符串。(someString 需要是 String 或 char * btw)。
不,你不能这样做,因为它是一个常数