0

最初に乱数を生成して文字列にキャストしようとしています。それは適切に行われますが、コンパイラは「警告:異なるサイズの整数からのポインタへのキャスト」を出します。そして、ここでの主な問題は、文字列を連結して応答を作成しようとしていることですが、何らかの理由で最初の strcat でさえ機能せず、そこで停止します。

char *name, *cseq;
srand (time(NULL));
char *session = (char*) ( rand() % (9999 - 1000 + 1) + 1000 );

char* response = "RTSP/1.0 200 OK\nCSeq: ";                     
strcat( response, cseq );                   
strcat ( response, "\n" );                      
strcat ( response, "Session " );
strcat ( response, session );                       
strcat ( response, "\n\n" );

printf("Response: %s", response);
4

3 に答える 3

8

いいえ、それは「適切に」行われません。あなたのコードは非常に壊れています。コンパイラは、警告を発するときに面白いことをしようとはしていません。彼らは通常、彼らが話していることを知っており、警告をトリガーするコードの何が問題なのかを理解する必要があるのはあなたです。何もないはずだからです。

あなたの場合、たとえばこのコード:

char *session = (char*) ( rand() % (9999 - 1000 + 1) + 1000 );

は無効でありsession、有効な文字列を指しているかのように使用すると、未定義の動作が発生する可能性が高くなります。

最初に予想されるエンコーディングで文字を記述するバイトの 0 で終わる配列でない限り、C の文字列に物事を「キャスト」することはできません。

たとえば、またはそのようなものを使用して、乱数から文字列を作成する必要があります。sprintf()

const int session_id = rand() % (9999 - 1000 + 1) + 1000;
char session[32];

snprintf(session, sizeof session, "%d", session_id);

もちろん、一度使い始めるsnprintf()と、すべての書式設定にそれを使用することもできますが、strcat()これは非常に鋭いツールであることに変わりはありません。

また、simonc が指摘したように、自分が行っているように文字列を変更することはできません。おそらく次のようなものがあるはずです:

char response[512];

snprintf(response, sizeof response, "RTSP/1.0 200 OK\nCSeq: %s\nSession %d\n\n",
         cseq, session_id);
printf("Response: '%s'", response);

これはsession_id上記から使用しますが、 への 1 回の呼び出しですべてのフォーマットをsnprintf()行うため、セッション ID の一時的な文字列バージョンは必要ないことに注意してください。

もちろん、returnこれを関数から外したい場合は、バッファ管理について考える必要がありresponseます。関数が終了するとスコープ外になるローカル変数であるため、そのまま返すことはできません。

于 2013-04-03T08:37:24.340 に答える
3
char* response = "RTSP/1.0 200 OK\nCSeq: "; 

読み取り専用の文字列リテラルを提供します。この内容を変更することはできません。

手っ取り早い修正方法はresponse、ハードコードされた長さで書き込み可能に変更することです。

char response[200] = "RTSP/1.0 200 OK\nCSeq: "; 

より良いアプローチは、さまざまな文字列コンポーネントの長さを計算してから、 のmallocメモリを計算することですresponse。これを行う場合は、free後で必ず電話してください。

sessionアンワインドが指摘した問題に加えて、cseqあなたの例では初期化されていないため、逆参照するとクラッシュすることに注意してください。

于 2013-04-03T08:36:43.097 に答える