0

我是 C 新手,最近我遇到了 strcat 函数的问题。我有一个参数数组定义如下:

#define MAXARGS 10;

char *argvalues[MAXARGS];

我想要的只是将数组的最后一个非空元素与空终止符连接起来。这是我的一段代码:

while (argvalues[i] != NULL) {
  if (argvalues[i] == NULL){
    strcat(argvalues[i-1], '/0');
    printf("i is: %d\n", i);
    break;
  }
  i++;
}

你知道为什么会发生分段错误吗?它实际上是正确的使用方式strcat吗?

4

8 回答 8

11

你的循环在你的数组末尾徘徊。这就是导致段错误的原因。在 C 中,无法保证未初始化的变量为 NULL,或者其他任何与此相关的变量。因此,您的循环会一直循环,直到它尝试访问不存在的 argvalues[11]。因此分段错误。

while (argvalues[i] != NULL) {
  if (argvalues[i] == NULL){

这两者相互矛盾。它甚至永远不会到达 if 语句,因为当 while 循环发现 argvalues[i] == NULL 时,它会首先退出。如果设置了所有 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");

为了弄清楚你在做什么,我们需要更多的描述和代码。将空终止符添加到参数的最佳位置是首次设置参数时。根据您设置参数的方式,它可能已经发生在您身上。

于 2009-11-03T19:28:45.197 回答
2

正如 Alcon 指出的那样,您将永远无法使用此代码到达 strcat() 。您需要将循环更改为以下内容:

while (i < MAXARGS) {
   ...
}

此外,将空指针传递给 strcat()。它需要一个字符串,而不是一个字符。'\0' 是一个空字符,它将被“提升”为空指针。"" 或 "\0" 将是一个空字符串,但也不会添加 null。strcat(0) 在这里使用不正确,因为它在连接之前查找空终止符。因此,您不能使用它来添加空终止符!

如果您在数组中的每个字符串上还没有空终止符,或者不知道它的长度,我看不出如何找到添加空终止符的结尾。这似乎是一种“打电话给我,我会告诉你我的电话号码”的情况。

于 2009-11-03T19:28:00.377 回答
0

这不是这样做的好方法!

如果您确定您的 char* 没有“\0”,您可以这样做:

char* oldargvalues = argvalues;
while(*argvalues++);
argvalues = 0;

(oldargvalues 是为了跟踪 char* 的开头)。但即便如此,这很奇怪,因为如果你已经有一个“\0”字符,循环就会结束。

于 2009-11-03T19:29:45.047 回答
0

爱尔康和弗雷德说的是真的,而且看起来你argvalues的已经是空终止的,所以不清楚你真正想要做什么。strcat除非第一个参数字符串在您分配的缓冲区中,否则您不应该使用它,因此您知道它足够大。就像如果你有void main(char* argv[], int argc)你永远不会说strcat(argv[i], ...),即使strcat(..., "")是无操作。

于 2009-11-03T19:33:56.270 回答
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++;
}
于 2009-11-03T19:34:51.573 回答
0

strcat 像这样连接两个 char 指针。

char *p1[12];
char *p2 = "world";
strcpy(p1,"hello ");
strcat(p1,p2);

pi 现在成立 - hello world 您必须确保目的地有足够的空间容纳连接的结果。

于 2009-11-03T19:39:03.497 回答
0

几个问题:

您的 argvalues 数组不会自动初始化为全部为 NULL,您必须手动执行此操作,因此在蝙蝠的右侧,您无法像其他人指出的那样在 while() 循环中检测到 NULL。

argvalues 是如何设置的?

于 2009-11-03T19:40:27.687 回答
0

谢谢大家的回复!!!!!!

我想我解决了这个问题,主要是我所做的是创建一个新的 char[size] 变量,然后复制其中的最后一个参数,将空终止符放入该变量中,然后复制回最后一个参数。工作正常,但代码很乱。所以以后可能会用它。strcat 仅适用于字符串,不适用于字符,感谢您指出我的代码中的所有不足!

谢谢大家!!!!非常感激!

于 2009-11-04T15:55:13.873 回答