连接空终止符会导致分段错误

时间:2009-11-03 19:24:18

标签: c strcat

我是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的正确方法吗?

8 个答案:

答案 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仅用于字符串,不用于字符,谢谢你指出我代码中的所有缺点!

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