我是C的新手,我遇到使用strcat()的问题。我查了strcat并发现它需要字符串作为参数,但是当我从char数组中拆分项时是一个char,当我用它作为strcat的参数时,它会输出错误。
#include <stdio.h>
#include <string.h>
int main()
{
char a[10]="abcdefg123";
char *pa=a;
char *out[2]={"",""};
int counter=0;
while(*pa != '\0'){
if (counter%2==0){
strcat(out[0],*pa);
}
else{
strcat(out[1],*pa);
}
counter++;
pa++;
}
printf("%s,%s\n",out[0],out[1]);
return 0;
}
代码的目的是将一个字符串拆分为两个字符串,每个字符串包含奇数位置或偶数位置的所有字符。但是,当我取消引用字符指针时,我得到的只是一个字符,但似乎我需要串
答案 0 :(得分:2)
在strcat
中使用临时字符串,而不是strcat(out[0],*pa);
。
另外,请确保为out
分配足够的内存。
int main()
{
char a[10]="abcdefg123";
char temp[2] = {0};
char *pa=a;
// This is not good for `strcat`.
// char *out[2]={"",""};
// Use this instead.
char out[2][20]={"",""};
int counter=0;
while(*pa != '\0'){
temp[0] = *pa;
if (counter%2==0){
strcat(out[0], temp);
}
else{
strcat(out[1], temp);
}
counter++;
pa++;
}
printf("%s,%s\n",out[0],out[1]);
return 0;
}
答案 1 :(得分:0)
第1点。根据strcat()
。 .. dest字符串必须有足够的空间用于结果。
第2点。strcat()
的第二个参数是const char *
,因此调用不能是strcat(out[0],*pa);
。您需要使用临时数组,它只包含值*pa
。否则,您可以使用strncat()
之类的
strncat(out[0], pa, 1); // copy only 1 char
在以后的情况下,您不需要任何临时数组。
参考:从手册页,再次,
strncat()
函数类似,但它将使用来自n
的最多src
个字节,而src
如果包含{n
则不需要以空值终止{1}}或更多字节。
答案 2 :(得分:0)
strcat()需要一个指向以null结尾的字符串的指针。您正在取消引用一个指针(使用*运算符),它提供了一个char。您不能简单地将char转换为指向sting的指针。您可能希望使用memcpy()而不是strcat(),但是为了复制单个字节,在左侧和右侧使用*运算符的简单赋值就可以了。但正如其他人已经指出你的代码没有为你复制字符分配空间,所以你需要做出额外的修改来解决这个问题。此外,您必须记住将最后一个空字节复制到两个输出字符串的末尾。
答案 3 :(得分:0)
在C中,“字符串”实际上只是指向字符的指针;字符串从该字符运行到终止的0字节(NUL
)。
如果取消引用字符串指针,则会获得该位置的字符。如果指针指向字符串的开头,则获取字符串的第一个字符。
您的程序存在一些问题。首先,您需要为新字符串分配空间。 strcat()
会尝试在任何你告诉它的地方复制字符,但确保那里有空间并且可以写在那里是你的工作。 out
的声明只声明了两个指针,并将它们初始化为指向零长度的常量字符串。相反,您需要分配存储,例如:
char out0[64], out1[64];
char *out[]={out0, out1};
这使得两个输出缓冲区各为64个字符,然后设置out
并指向它们。
另一个问题:你为char数组声明了一个10的长度,但是你用一个长度为10的字符串初始化它。这意味着没有空间用于终止NUL字节,C不会放置一个。然后strcpy()
或strcat()
将从字符串中复制额外的垃圾,直到碰巧有一个NUL字节。如果你很幸运的话会有一个你马上就会发现错误,但是如果你不幸运,你会得到奇怪的垃圾。
让编译器计算字符串中的字节数并做正确的事情。遗漏长度:
char a[]="abcdefg123";