如何通过检查分隔符在字符串中添加字符?

时间:2015-01-09 15:17:01

标签: c string

我的程序中有一个字符串,需要在" /"之前用另一个字符串值进行更改。

源字符串:qos-tree / output_rate 目标字符串:qos-tree-2 / output_rate

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

void append(char* s, char c)
{
        int len = strlen(s);
        s[len] = c;
        s[len+1] = '\0';
}

int main(void)
{
        char str[256] = "qos-tree/output_rate";
        char c = "a";

        append(str, c);

        printf("%s\n", str);
        return 0;
}

这是我到目前为止所做的,我认为这里的逻辑是错误的。任何人都可以指导我纠正它吗? 执行完成后,源字符串应该有一个&#34; -2&#34;在&#34; /&#34;

之前

4 个答案:

答案 0 :(得分:2)

在你的尝试中,你不会寻找斜线,我在任何地方都看不到任何“-2”。

请改为尝试:

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

void append(char* s, char del, char* substring) {
  char origin[256];
  strcpy(origin, s);
  int i = 0, j = 0, z = 0;

  for(; origin[i]; ++i) {
    if(origin[i] != del) {
      s[j++] = origin[i];
    } else {
      for(; substring[z]; ++z) {
        s[j++] = substring[z];
      }
      s[j++] = origin[i];
    }
  }
  s[j] = '\0';
}

int main(void) {
  char str[256] = "qos-tree/output_rate";
  char del = '/';
  char* substring = "-2";

  append(str, del, substring);

  printf("%s\n", str);
  return 0;
}

逻辑是在函数内部我们使用origin数组来记住数组的实际内容,然后我们从origin复制到s(这是{的实际数组{1}})。如果我们找到了分隔符main(),那么我们会将del复制到该位置并继续复制。


请注意,数组的长度应足以存储生成的字符串。在这种情况下,它是。

答案 1 :(得分:2)

void insert_before_ch(char *s, const char *ins, char c){
    char *p = strchr(s, c);
    if(p){
        size_t len = strlen(ins);
        memmove(p + len, p, strlen(p)+1);
        memcpy(p, ins, len);
    }
}

int main(void){
    char str[256] = "qos-tree/output_rate";

    insert_before_ch(str, "-2", '/');

    printf("%s\n", str);
    return 0;
}

答案 2 :(得分:1)

首先,char c = "a"应该替换为char c = 'a';,因为c是一个字符而不是字符串

关于你的问题我没有真正看到你的代码正在做什么与你说你想做什么之间的关系,但是这里有一段代码来实现你想做的事情:

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




void append(char* str , char c)
{
    char firststr[60];
    char therest[30];
    strcpy(firststr , strtok(str , "/"));
    strcpy(therest , strtok(NULL , "/"));
    strcat(firststr , &c);
    strcat(firststr , "/");
    strcat(firststr , therest);
    strcpy(str , firststr);
}
int main(void)
{
    char str[60] = "qos-tree/output_rate";
    char c = '2';

    append(str , c);
    printf("%s\n" , str);
}

你去了我认为这是你想要做的,你可以修改数组大小以满足你的需要

答案 3 :(得分:1)

我认为你应该让你的函数使用动态分配,因为在字符串中插入字符会使得结果字符串更大,所以这是我的建议

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

void insert(char **str, char chr, unsigned int position)
{
        int   length;
        char *ptr;

        if (str == NULL)
                return;
        length = strlen(*str);
        if (position >= length)
                return;
        ptr = realloc(*str, 2 + length);
        if (ptr == NULL)
                return;
        *str = ptr;

        memmove(ptr + position + 1, ptr + position, length - position + 1);
        ptr[position] = chr;
}

int main(void)
{
        const char *source = "qos-tree/output_rate";
        size_t      length = strlen(source);
        char       *str    = malloc(1 + length);

        if (str == NULL)
                return -1;
        strcpy(str, source);

        insert(&str, '-', 8);
        insert(&str, '2', 9);

        printf("%s\n", str);

        free(str);
        return 0;
}