我是C的新手,最近我遇到了strcat函数的问题。 我有一个定义的数组,如:
#define MAXARGS 10;
char *argvalues[MAXARGS];
我想要的是将数组的最后一个非null元素与null终止符连接起来。以下是我的代码:
while (argvalues[i] != NULL) {
if (argvalues[i] == NULL){
strcat(argvalues[i-1], '/0');
printf("i is: %d\n", i);
break;
}
i++;
}
你知道为什么会发生分段错误吗?它实际上是使用strcat
的正确方法吗?
答案 0 :(得分:11)
你的循环在数组的末尾徘徊。这就是导致段错误的原因。在C中,无法保证未初始化的变量将为NULL或其他任何内容。所以你的循环会一直循环,直到它试图访问不存在的argvalues [11]。因此分段错误。
while (argvalues[i] != NULL) {
if (argvalues[i] == NULL){
这两者相互矛盾。它永远不会到达if语句,因为当发现argvalues [i] == NULL时,while循环将首先退出。如果设置了所有10个参数,那么您将尝试访问argvalues [11],这将像前面提到的那样进行段错误。
要正确使用strcat,你必须有一个字符串缓冲区,它足够大,可以接受你连接到它结尾的字符串。例如,如果要将“world”添加到已包含“hello”的缓冲区,则必须将hello缓冲区声明为至少与“hello”+“world”加1个字符('\ 0'一样长最后)。
// Here's an example.
char buffer[12];
strcpy(buffer, "hello");
strcat(buffer, " world");
如果您尝试这样做,它将失败:
// Buffer isn't big enough to copy into.
char buffer[] = "hello";
strcat(buffer, " world");
要弄清楚你正在做什么,我们需要更多的描述和代码。将null终止符添加到参数的最佳位置是首次设置参数时。根据你如何设置你的论点,它可能已经发生在你身上。
答案 1 :(得分:2)
正如Alcon指出的那样,你永远不会用这段代码到达strcat()。您需要将循环更改为以下内容:
while (i < MAXARGS) {
...
}
另外,将空指针传递给strcat()。它需要一个字符串,而不是一个字符。 '\ 0'是一个空字符,它将被“提升”为空指针。 “”或“\ 0”将是一个空字符串,但也不会添加空字符串。 strcat(0)在这里使用不正确,因为它在连接之前查找null终止符。因此,您不能使用它来添加空终止符!
如果你没有在数组中的每个字符串上有一个空终止符,或者知道它的长度,我看不到你如何找到结尾添加一个空终止符。这似乎是“打电话给我,我会告诉你我的电话号码”的情况。
答案 2 :(得分:0)
这不是这样做的好方法!
如果您确定您的char *没有“\ 0”,您可以这样做:
char* oldargvalues = argvalues;
while(*argvalues++);
argvalues = 0;
(oldargvalues是为了跟踪char *的开头)。 但即便如此,如果您已经有一个“\ 0”字符,那么循环将会结束,这很奇怪。
答案 3 :(得分:0)
Alcon和Fred说的是真的,而且看起来你的argvalues
已经被空终止了,所以你不清楚你真正想要做什么。
您不应该使用strcat
,除非第一个参数字符串位于您已分配的缓冲区中,因此您知道它足够大。就像你有void main(char* argv[], int argc)
一样,你永远不会说strcat(argv[i], ...)
,即使strcat(..., "")
是无操作。
答案 4 :(得分:0)
我不明白你的循环。看起来它永远不会做任何事情。在while循环中,检查argvalues [i]!= NULL。在下一个语句中,检查它是否为NULL。其中一个总是假的(它不能同时是NULL和非NULL),所以这个循环永远不会做任何事情。我想你想要的东西如下:
#define MAXARGS 10;
char *argvalues[MAXARGS];
int i = 1;
while (i < MAXARGS)
{
if (argvalues[i] == NULL)
{
//Notice here: as mentioned by other posters, you need to pass
//a string to strcat, not a char
strcat(argvalues[i-1], "");
printf("i is: %d\n", i);
break;
}
i++;
}
答案 5 :(得分:0)
strcat连接两个char指针,如此。
char *p1[12];
char *p2 = "world";
strcpy(p1,"hello ");
strcat(p1,p2);
pi现在持有 - 你好世界
您必须确保目的地有足够的空间来连接结果。
答案 6 :(得分:0)
一些问题:
你的argvalues数组不是自动初始化为全NULL,你必须手动执行,所以在bat的右边,你不能像其他人指示的那样在你的while()循环中检测到NULL。 / p>
如何设置argvalues?
答案 7 :(得分:0)
谢谢大家的回复!!!!!
我认为我解决了这个问题,主要是我所做的是创建一个新的char [size]变量,然后复制其中的最后一个参数,将null终止符放在该变量中,然后复制回最后一个参数。工作正常,但代码很乱。所以稍后可能会用它来做。 strcat仅用于字符串,不用于字符,谢谢你指出我代码中的所有缺点!
谢谢大家!!!! 非常感谢!