0

したがって、「文字列」の配列へのポインタを受け取る関数があります(文字列は、「\ 0」が後に続く単なるメモリのブロックとして理解されます)。文字列はすでに文字列の最初のバイトへのポインタであるため、私のポインタは実際には**doublePointerです。しかし、私は陰陽を分断しているので、正直なところ、低レベルのビューで何が起こっているのかわかりません。以下の私のコードは次のとおりです。その機能は、文字を読み取り、最初の単語の最初の文字(文字列内)とピリオドの後を大文字にすることです。

    void autocaps(char ** words)
    {

    /* Add code here */
    //Period Boolean
    bool next=false;
    //First Word Boolean
    bool fcap=true;
    //Counter Variable
    int i=0;
    int j=0;
    //Second Pointer
    char** wordx = words;

    //LowerCase Bomb & Period Flagging
    while(wordx[i][j]!='\0'){
      while(wordx[i][j]!='\0'){
       //A-Z Filter
       if((wordx[i][j]>='A')&&(wordx[i][j]<='Z')){
      wordx[i][j]+=32;
       }
       if(wordx[i][j]=='.'){
      next=true;
       }
      j++;
      }
    i++;
    }

 i=0;
 j=0;
 //Cap First Word & Cap Post Period
 while(words[i]!='\0'){
   while(words[i][j]!='\0'){
    //a-z Filter
    if((words[i][j]>=97)&&(words[i][j]<=122)){
  if(fcap){
    words[i][j]-=32;
    fcap=false;
  }
  if(next){
    words[i][j]-=32;
  }
    }
    j++;
  }
 i++;
}
return;

}

パラメータを介して渡された元のポインタを印刷しているときに、セグメント障害が発生しています。私がとても混乱しているので、誰かが私にこれの低レベルの概念を説明することができれば、私はいたるところに3つ星と4つ星を投げています、そしてそれが私のコードのデバッグに近づいたり遠ざかったりするかどうかさえわかりません。

ありがとうございました!!

4

2 に答える 2

0

文字列の配列を次のような定数文字列として初期化しています。

char *words[2] = {"hello", "world"};

その後、最初に到達したときにセグメンテーション違反が発生します

**words+=32;

読み取り専用の場所を変更しようとしているためです。

次のように文字列を初期化する必要があります。

char word1[] = {'h', 'e', 'l', 'l', 'o', 0};
char word2[] = {'w', 'o', 'r', 'l', 'd', 0};
char *words[] = {word1, word2};

他の問題は確かに

*words++;

次の2つの理由から、これを実行したくない場合があります。

  1. 他のポスターで述べたように、++は間接参照演算子よりも優先されるため、実際には、単語配列を1つの文字列から次の文字列にインクリメントし、1つの文字から次の文字列にインクリメントします。
  2. その場合、間接参照演算子は何の影響も及ぼしません。

さて、あなたが次のキャラクターに進みたいのなら、あなたはこれをしたくありません:

(*words)++

これは、words配列内のポインターを実際に変更しているので、変更したくないためです。

于 2013-02-08T20:23:34.487 に答える
0

「文字列の配列」と言いましたが、コードと意図 (最初の文字とピリオドの後に大文字を使用) に基づいて、関数に渡す単一の文字列でこれが機能すると仮定します。

文字列は、文字列の後に値 0 が続く単なる配列です。やりたいことは、文字の配列をトラバースすることです。文字ポインターから、ポインターを逆参照する文字を取得するには。そのため、文字列内の現在の文字を実際に検査するすべての場所に「*words」が表示されます。

2 重、3 重、4 重のポインターは、解決策から遠ざかっていました。

作り直したサンプルを次に示します。

void autocaps(char* words)
{
  bool fcap=true; /* true so first letter is made cap */

  while (*words != '\0') 
  {
    if (fcap)
    {
        /* capitalize */
        if ((*words >= 'a') && (*words <= 'z'))
        {
            *words -= 32;
        }

        fcap = false;
    }
    else
    {
        /* not cap */
        if ((*words >= 'A') && (*words <= 'Z'))
        {
            *words += 32;
        }
    }

    /* period - cap next letter */
    if (*words == '.')
    {
        fcap = true;
    }

    /* step to next character in array */
    words++;
  }

  return;
}
于 2013-02-08T07:58:46.157 に答える