下面的代码尝试增加字符串中的最后一个索引,例如:if label =“1_1_9”,find_next_label(label)将返回“1_1_10”。
这很有效。但是,我也想改变原始标签,也增加它。例如:如果label =“1_1_9”,find_next_label(label)将返回“1_1_10”,在此过程中,label也变为“1_1_10”。
以下代码无法执行此操作。 main()
函数的结果显示标签仍为“1_1_9”。
有人可以帮忙找出问题所在吗?
char * find_next_lable(char * label)
{
int length = strlen(label);
char * last_index = label + length - 1;
int num = atoi(last_index);
num = num + 1;
char * next_lable = malloc(sizeof(label));
strncpy(next_label, label, length-1);
*(next_label + length - 1) = '\0';
sprintf(next_label, "%s%d", next_label, num);
label = next_label;
return label;
}
int main()
{
char * s = malloc(6);
strcpy(s, "1_1_9");
char * n = find_next_label(s);
printf("%s\n", s);
printf("%s\n", n);
return 0;
}
答案 0 :(得分:0)
last_index()
和atoi()
代码块假定最终数字只有一位数;显然这不是很一般。您可以搜索最后一个下划线,并转换后面的字符中的数字。使用strrchr()
查找最后一个下划线。
此外,您必须考虑很多缓冲区大小和溢出,您应该使该函数接受可用的缓冲区大小作为附加参数,尤其是如果您想要修改输入。如果你想要那个,那么分配额外空间当然没有意义,只需返回输入。
答案 1 :(得分:0)
main()函数的结果显示lable仍为1_1_9。
那是因为您没有更改s
中main
指向的动态分配数组。而是在函数find_next_lable
中分配新内存。另外,
sprintf(next_lable, "%s%d", next_lable, num);
将无效,因为%s
转换说明符意味着sprintf
将从next_lable
指向的缓冲区读取,直到并包括终止空字节。
您必须分配足够的内存以包含递增的整数部分。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// make sure MAX is large enough to
// contain the modified string
#define MAX 20
void find_next_lable(char *label);
int main(void)
{
char *s = malloc(MAX);
strcpy(s, "1_1_90");
printf("%s\n", s);
find_next_lable(s);
printf("%s\n", s); // prints 1_1_91
free(s);
return 0;
}
void find_next_lable(char *label)
{
// strrchr returns a pointer to the last
// occurrence of the character _ in label
char *last_index = strrchr(label, '_');
if(last_index == NULL)
{
last_index = label;
}
else
{
last_index++;
}
int num = atoi(last_index);
num = num + 1;
sprintf(last_index, "%d", num);
}
答案 2 :(得分:0)
如果您不需要创建新字符串,则可以执行以下操作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 20
int main()
{
char *s = malloc(MAX_LEN); /* You must have enough memory if the number of chars grows! */
char *n;
int i;
strcpy(s, "1_1_9");
printf("%s\n", s);
n = strrchr(s, '_'); /* find the last '_' */
n++; /* and move to the number */
i = atoi(n);
sprintf(n, "%d", i+1); /* write the new value instead of the old one */
printf("%s\n", s);
free(s);
return 0;
}
否则你可以拥有这个功能:
char * find_next_lable(char *label)
{
char *n, *next_lable = malloc(sizeof(MAX_LEN));
int i;
strcpy(next_lable, label);
n = strrchr(next_lable, '_');
n++;
i = atoi(n);
sprintf(n, "%d", i+1);
return next_lable;
}