C语言中的字符串连接

C语言中的字符串连接,c,string,concatenation,C,String,Concatenation,所以我得到了这个函数,如果没有空格的话,它可以把空格放在“/”C前面。它很好地分割了字符串,但我得到了一个错误,当我试图将字符串合并在一起时,可能是内存冲突。请帮我一把 #include <stdio.h> #include <stdlib.h> #include <string.h> char* substr(const char *pstr, int start, int numchars) { char* pnew = malloc(numch

所以我得到了这个函数,如果没有空格的话,它可以把空格放在“/”C前面。它很好地分割了字符串,但我得到了一个错误,当我试图将字符串合并在一起时,可能是内存冲突。请帮我一把

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

char* substr(const char *pstr, int start, int numchars) {
    char* pnew = malloc(numchars + 1);
    strncpy(pnew, pstr + start, numchars);
    pnew[numchars] = '\0';
    return pnew;
}

char* fixString(char str[]) {
    char* position;
    char* newString = "";
    char* finalString;

    int oldPosition = 0;
    printf("Original str: %s\n", str);
    printf("Original length: %d\n\n", strlen(str));

    position = strchr(str, '/');
    while (position != NULL) {
        int charPosition = position - str;

        printf("String position: %d->%d\n", oldPosition, charPosition);
        newString = substr(str, oldPosition, charPosition - oldPosition);
        oldPosition = charPosition;
        if (charPosition > 0 && str[charPosition - 1] != ' ') {
            printf("Previous char: %c\n", str[charPosition - 1]);
            newString = strcat(newString, " ");
        }

        printf("String: |%s|\n", newString);
        if (strlen(newString) > 0) {
            finalString[0] = strcat(finalString, newString);
        }
        printf("------------\n");
        position = strchr(position + 1, '/');
    }
    char* lastString = substr(str, oldPosition, strlen(str));
    finalString = strcat(finalString, lastString);
    printf("lastString: %s\n\n", lastString);
    return finalString;
}

int main() {
    char* testString = "/Filter /FlateDecode/Length 7108/Subtype /Type1C";
    printf("%s", fixString(testString));

    return 0;
}
#包括
#包括
#包括
char*substr(常量char*pstr,int start,int numchars){
char*pnew=malloc(numchars+1);
strncpy(pnew、pstr+启动、numchars);
pnew[numchars]='\0';
返回pnew;
}
char*fixString(char str[]){
字符*位置;
char*newString=“”;
最后一环;
int oldPosition=0;
printf(“原始str:%s\n”,str);
printf(“原始长度:%d\n\n”,strlen(str));
位置=strchr(str,“/”);
while(位置!=NULL){
int charPosition=位置-str;
printf(“字符串位置:%d->%d\n”,oldPosition,charPosition);
newString=substr(str,oldPosition,charPosition-oldPosition);
oldPosition=charPosition;
if(charPosition>0&&str[charPosition-1]!=''){
printf(“上一个字符:%c\n”,str[charPosition-1]);
newString=strcat(newString,“”);
}
printf(“字符串:|%s |\n”,新闻字符串);
如果(strlen(newString)>0){
finalString[0]=strcat(finalString,newString);
}
printf(“-------------\n”);
位置=strchr(位置+1’/);
}
char*lastString=substr(str,oldPosition,strlen(str));
finalString=strcat(finalString,lastString);
printf(“lastString:%s\n\n”,lastString);
返回最后一环;
}
int main(){
char*testString=“/Filter/FlateDecode/Length 7108/Subtype/Type1C”;
printf(“%s”,fixString(testString));
返回0;
}

您从不分配目标缓冲区。
finalString
变量未初始化为任何值

这也不是代码的唯一问题。您似乎将
char*
视为某种智能字符串类型,但它只不过是指向内存位置的指针。例如:

newString = strcat(newString, " ");
不连接两个字符串并返回连接的结果。它在char缓冲区上追加一个空格,newString指向并返回相同的缓冲区。分配给新闻字符串是无害的,但会产生误导

// It is the callers responsibility to free the returned string.
char *fixString(char *str) {
    int len;
    char *s;
    char *dest;
    int after_space;

    // First pass, figure out the size of the output.
    len = 0;
    after_space = 0;
    for (s = str; *s; s++) {
        len += 1 + (!after_space && *s == '/');
        after_space = *s == ' ';
    }
    dest = malloc(len + 1);

    s = dest;
    after_space = 0;
    while(*str) {
        if (!after_space && *str == '/') *s++ = ' ';
        after_space = (*s++ = *str++) == ' ';
    }
    return dest;
}

您需要为
finalString
分配一些内存

试着这样做:

#define BUFFER_SIZE 1024
char* finalString = malloc(BUFFER_SIZE);
// ...
strncat(finalString, "something", 1024);

记住,当不再需要指针时(不在函数中-函数返回后,在客户端代码中的某个地方,当结果不需要时),在指针上调用
free()

您永远不会
newString
finalString
指针的
malloc
内存
strcat
希望您给它的目标指针有足够的空间来存储字符串。

如有必要,您可能还需要检查malloc()和realloc()之后的大小。欢迎来到美丽的C语言内存管理世界:)

请以问题的形式重新表述。谢谢。你从来没有
malloc
内存来存储你的
newString
finalString
。问题:我做错了什么?嗯,我在这方面从来没有遇到过问题。新闻字符串由substr进行malloc'ed,对吗?@Thomas-没错,
substr
malloc
作为
newString
的指针,但这也可能是一个潜在的问题,因为:a)你从未
释放
指针,b)你最终试图
strcat
进入
newString
,而且
newString
没有分配足够的空间来存储生成的连接字符串。我明白了,所以在while循环中,我应该在每次运行之间释放newString,对吗?@Thomas-当您使用完分配的指针后,您应该
释放
它们。正如您现在的代码一样,您可以在
fixString
函数的末尾执行
free
。在函数的中间,你可能会在<代码> NeXStudio上执行<代码> ReLoCu,并且在调用<代码> ReAlLC/之前,你不必<代码>免费>代码>。我想你误解了。我想用“/”来更改所有“/”和“/”如果“/”之前字符中没有空格。@托马斯:就像我说的,我没有深入分析你的代码。关键是,您应该首先分配一个缓冲区,然后根据需要的逻辑从源字符串复制来填充它。在这种情况下,您必须分配两倍的空间,以防源代码中的每个字符都是
/
,或者进行两次传递,一次计算结果缓冲区需要多大,另一次计算实际的转录。@Thomas:我已经用一个解决方案修改了我的答案。