如何通过检查分隔符在字符串中添加一个字符?
How to add a character in a string by checking the delimiter?
我的程序中有一个字符串需要在“/”之前用另一个字符串值进行更改。
源字符串: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] = '[=10=]';
}
int main(void)
{
char str[256] = "qos-tree/output_rate";
char c = "a";
append(str, c);
printf("%s\n", str);
return 0;
}
这是我到目前为止所做的,我认为逻辑是错误的here.Can谁能指导我更正它?
执行完成后,源字符串在“/”
之前应该有一个“-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] = '[=10=]';
}
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
(这是实际的数组main()
)。如果我们找到分隔符 del
,那么我们复制那个位置的 substring
并继续复制。
注意数组的长度应该足以存储结果字符串。在这种情况下,它是。
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;
}
首先这个 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);
}
好了,我想这就是你想要做的你可以修改数组大小以满足你的需要
我认为你应该让你的函数使用动态分配,因为在字符串中插入字符会使结果字符串变大,所以这是我的建议
#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;
}
我的程序中有一个字符串需要在“/”之前用另一个字符串值进行更改。
源字符串: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] = '[=10=]';
}
int main(void)
{
char str[256] = "qos-tree/output_rate";
char c = "a";
append(str, c);
printf("%s\n", str);
return 0;
}
这是我到目前为止所做的,我认为逻辑是错误的here.Can谁能指导我更正它? 执行完成后,源字符串在“/”
之前应该有一个“-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] = '[=10=]';
}
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
(这是实际的数组main()
)。如果我们找到分隔符 del
,那么我们复制那个位置的 substring
并继续复制。
注意数组的长度应该足以存储结果字符串。在这种情况下,它是。
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;
}
首先这个 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);
}
好了,我想这就是你想要做的你可以修改数组大小以满足你的需要
我认为你应该让你的函数使用动态分配,因为在字符串中插入字符会使结果字符串变大,所以这是我的建议
#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;
}