如何用C语言替换字符串的最后一个索引?

时间:2014-05-02 07:24:29

标签: c

下面的代码尝试增加字符串中的最后一个索引,例如: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;
}

3 个答案:

答案 0 :(得分:0)

last_index()atoi()代码块假定最终数字只有一位数;显然这不是很一般。您可以搜索最后一个下划线,并转换后面的字符中的数字。使用strrchr()查找最后一个下划线。

此外,您必须考虑很多缓冲区大小和溢出,您应该使该函数接受可用的缓冲区大小作为附加参数,尤其是如果您想要修改输入。如果你想要那个,那么分配额外空间当然没有意义,只需返回输入。

答案 1 :(得分:0)

  

main()函数的结果显示lable仍为1_1_9。

那是因为您没有更改smain指向的动态分配数组。而是在函数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;
    }