1

在下面的带有 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;
4

3 回答 3

2

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

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

修复程序的最简单方法是猜测newstring它会持续多长时间,并使用strcat它来追加数据:

char newstring[1000]; // some max length
newstring[0] = '\0';  // make it an empty string
...
strcat(newstring, value); // instead of newstring += value
于 2013-02-19T18:01:57.737 回答
1
newstring += value

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

首先,您应该有一些空间来存储新字符串,例如

char newstring[64];

然后通过执行附加一个字符

newstring[j] = tempfullstring[i];

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

strncat(newstring+j, tempfullstring+i, 1);
于 2013-02-19T18:02:35.460 回答
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;
于 2013-02-19T18:04:30.423 回答