1

printf() ステートメントを含む次のコードでは、セグメンテーション違反が発生します。どうすればこれを行うことができますか?

  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)。

プログラムを修正する最も簡単な方法は、プログラムの長さを推測し、それにデータを追加するために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 に答える