在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;
};
我想要的是
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
需要能够容纳字符串+的。'-'
+空字符。