不能将特定字符添加到char*的开头,在C语言中它只允许我在后面添加?

问题描述 投票:0回答:1

在C语言中,我在字符串的开头添加'-'时遇到了问题,因为它会导致seg-fault。在字符串的结尾添加'-'似乎没有问题。本质上,结构有两个字段,如果其中一个字段的值是'-1',那么这个值就是负值,'-1'将被添加到结构的另一个字段中。在开始时添加'ch'是导致它发生segfault的原因。

下面是代码。

        unsigned int toPrint = size(unitLiterals);
    qsort(unitLiterals->element, toPrint, sizeof(Literal*), sort);
    for (unsigned int i = 0; i < toPrint; i++){
        Literal*literal = get(unitLiterals, i);
        if (literal->isNegative == 1){
            printf("%s", literal->name);

        }
        else {
            char *ch = "-";
            strcat((char*)literal->name, ch);
            printf("%s", literal->name);
        }
        if (i != toPrint-1){
            printf(" ");
        }
        else {
            printf("\n");
        }
    }

结构初始化

Literal *newLiteralStruct (char *name, int i){
    Literal *this = malloc(sizeof(Literal));
    this->name = name;
    this->isNegative = i; 
    return this;
}

头文件中的字元。

typedef struct Literal Literal;

struct Literal {
    char* name;
    int isNegative;
};
c strcat
1个回答
2
投票

我想要的是 ch 加在开头& 而不是结尾,我不知道如何解决这个问题。

不要使用 strcat 的结果。strcat 总是将第二个参数指向的字符串的副本附加到第一个参数指向的字符串的末尾,而不是开头。

你可以使用一个缓冲区和一系列对 strcpy 而不是。

 char *ch = '-';                          // Note the `-` is a character, not a string.
 char buf[N];                   
 buf[0] = *ch;                            // Copy `-` to the first element of `buf`. 
 strcpy(&buf[1], literal->name);          // Copy the string in `name` to `buf`,
                                          // starting at the second element of `buf`.   
 strcpy(literal->name, buf);              // Copy the string in `buf` back to `name`.
 printf("%s", literal->name);

注意: name 必须有一个额外的元素来容纳增加的 - 字符,当然还有一个元素用来存储结束的空字符。同时,缓冲区需要能够容纳字符串在 name 再加上 - 和空字符。

您也可以省略 ch 因为它不需要,并且使代码更紧凑。

 char buf[N];
 buf[0] = '-';
 strcpy(&buf[1], literal->name);
 strcpy(literal->name, buf);
 printf("%s", literal->name);

或者你可以将字符串中的每一个字符都用 name 前进一个元素(包括空字符),然后赋于 '-' 的第一要素 name:

size_t len = strlen(literal->name);
for ( size_t i = 0; i < (len + 1); i++ )
{
    literal.name[i+1] = literal.name[i];
}
literal.name[0] = '-'; 

但在这里又是如此。name 需要能够容纳字符串+的。'-' +空字符。

© www.soinside.com 2019 - 2024. All rights reserved.