打印时出现C分段故障错误

时间:2013-02-19 17:58:38

标签: c string printf fault

在下面的printf()语句代码中,我得到了一个分段错误:11。没有它我没有得到任何错误,但我希望能够看到正确的值在newstring值中。我该怎么做呢?

  char* newstring;
  for(int i = 0; i < len; i++)
  {
    printf("value %d\n", tempfullstring[i]);
    if (tempfullstring[i]>=97 && tempfullstring[i] <=122)
    {
      char value = tempfullstring[i];
      newstring += value;
    }
  }
  printf("The new string is %s", newstrng);
  return 0;

3 个答案:

答案 0 :(得分:2)

我认为您对C字符串的工作方式存在误解:

  • 他们 not 在声明时被初始化(因此char* newstring;必须单独分配,否则你会得到未定义的行为)
  • 他们无法与+=运算符连接(因此newstring += value;无效)
  • 需要明确管理C字符串的空间(因此您需要在自动存储区域中分配newstring,或在末尾添加free)。

修复程序的最简单方法是猜测newstring的长度,并使用strcat向其追加数据:

char newstring[1000]; // some max length
newstring[0] = '\0';  // make it an empty string
...
strcat(newstring, value); // instead of newstring += value

答案 1 :(得分:1)

newstring += value

您正在以非法的方式追加字符串,您实际在做的是更改未初始化的指针,因此您将更改地址移至另一个无效地址

首先,您应该有一些空间,您可以使用

存储新字符串
char newstring[64];

然后通过

附加一个字符
newstring[j] = tempfullstring[i];

这不会附加NUL终止字符,您必须手动将其添加到结尾或使用其他方法(例如使用strncat并直接从原始字符串追加:

strncat(newstring+j, tempfullstring+i, 1);

答案 2 :(得分:1)

这是你想要使这项工作的代码。

 char* newstring = malloc (sizeof(char)*len+1);   // this will be worst case (all are >=97 o <=122
    int j=0;
      for(int i = 0; i < len; i++)
      {
        printf("value %d\n", tempfullstring[i]);
        if (tempfullstring[i]>=97 && tempfullstring[i] <=122)
        {
          char value = tempfullstring[i];
          newstring[j]= value;
          j++;
        }
      }
      newstring[j]='\0';
      printf("The new string is %s", newstrng);
      return 0;