1

strtok を使用して、文字列 names[result] から 2 つの単語を抽出しています。strtok から最初の値を取得し、それを lastName という名前の char 配列に格納し、2 番目の値を firstName という名前の char 配列に格納します。ただし、コードをコンパイルしたときに、矢印で示されている 2 行で無効な初期化エラーが発生しました。問題を解決するにはどうすればよいですか?

char *p = NULL;
p = strtok(names[result]," ");
char lastName[50] = p; <---
p = strtok(NULL, " ");
char firstName[50] = p; <---
printf("%s %s\n",firstName,lastName);
4

4 に答える 4

1

strtokは、トークン化された文字列へのポインタを提供します。

char lastName[50] = p;あなたがそこでやっているのは本当に良いことではありません。strncpy()を使用して文字列をコピーする必要があります。または、ポインタのみが必要な場合は、別のポインタに格納する必要があります。

于 2012-10-26T11:28:38.140 に答える
1

C での配列の初期化では、変数ではなくリテラルのみを使用できます。したがって、コードは構文エラーです。

通常の関数を使用して文字列をコピーするか、 orstrcpy()などのより安全な (そして最新の) 変数を使用する必要があります。strlcpy()snprintf()

sscanf()バッファ オーバーフローのリスクを回避するために、フォーマット文字列に適切なサイズ指定子を指定してを使用して、1 回の呼び出しで解析とコピーを行うこともできます。

于 2012-10-26T11:42:17.107 に答える
0

char lastName[50] = "Sample"; のように、文字列を文字配列に初期化できます。この場合、文字配列 'char lastName[50] = p;' へのポインターを初期化しようとしています。これは無効です。strcpy、memcpy 関数を使用して文字列を文字配列にコピーするか、別のポインターに割り当てることができます。

于 2012-10-26T11:47:37.263 に答える
0

他の答えはすべて、文字列データをコピーするとこのプログラムが機能するという点で正しいですが、その理由strtokは非常に卑劣です(通常、それを使用することは賢明ではないと見なされます)NULL。元の文字列に s を挿入して入力を変更するためです。とにかくそれを使用する場合は、これを利用して、strtok直接返されるポインターを使用することもできます。

ただし、入力が変更され、その入力を渡した人はそれを予期していない可能性があるため、入力を呼び出す前に、まずstrtok入力を別の文字列にコピーすることをお勧めします。

このコードの出力を観察して、私が何を意味するかを確認してください。

int main(int argc, char *argv[]) {
  char name[] = "Firstname Lastname";

  printf("Name before strtok: %s\n", name);
  char *first = strtok(name, " ");
  char *last = strtok(NULL, " ");

  printf("Token strings: first=%s last=%s\n", first, last);
  printf("Name after strtok: %s\n", name);
}

プロデュース:

Firstname Name before strtok: Firstname Lastname
Token strings: first=Firstname last=Firstname
Name after strtok: Firstname
于 2018-01-30T02:07:36.400 に答える