-1

私はこのコードでsscanfを使用します

while(totalByte < sizeof(rdata)) 
{   
    read(client_sockfd, &buffer[totalByte],1); 
    printf("bytes[%d] : %x \n", totalByte, buffer[++totalByte]);
}

このコードを使用すると、このような結果が得られました

クライアント送信 1 1 +

bytes[0] : 0  
bytes[1] : 0  
bytes[2] : 0  
bytes[3] : 1  
bytes[4] : 0  
bytes[5] : 0
bytes[6] : 0  
bytes[7] : 1  
bytes[8] : 2b 
bytes[9] : 0  
bytes[10] : 0  
bytes[11] : 0 
bytes[12] : 0  
bytes[13] : 0  
bytes[14] : 0  
bytes[15] : 0  
bytes[16] : 0  
bytes[17] : 0 
bytes[18] : 0  
bytes[19] : 0 

結果を得た

次に、sscanfメソッドを使用します

sscanf(buffer,"%d%d%c" ,&rdata.left_num, &rdata.right_num, rdata.op); 
printf("%d %c %d \n", ntohl(rdata.left_num),rdata.op,ntohl(rdata.right_num));

しかし、rdata(構造)の値を出力すると、0の値(初期値)が得られます。

0 0

私はsscanfメソッドが文字列を分割して値を挿入することを知っています

私に誤解はありますか?

これは私が使用した構造です

struct cal_data 
{  
    int left_num;  
    int right_num;
    char op;  
    int result;  
    int error;  
}; 
4

3 に答える 3

3

私はこれがあなたが望むことをしているとは思わない:

printf("bytes[%d] : %x \n",totalByte, buffer[++totalByte]);

それが機能している場合は、偶然に機能しています。論理よりも偶然に頼りたくないですよね?ここで未定義の動作の詳細については、この質問をお読みください。これを次のように変更し、将来ロジックを詰め込むためにシーケンス ポイントを省略しないようにします。

printf("bytes[%d] : %x \n",totalByte, (unsigned int) buffer[totalByte]);
totalByte++;

次に、sscanfメソッドを使用します sscanf(buffer,"%d%d%c" ,&rdata.left_num, &rdata.right_num, rdata.op);

エラーチェックはどこですか?ほとんどの標準 C 関数と同様に、コードで sscanf の戻り値をチェックして、必要な量の情報が抽出されていることを確認する必要があります。sscanf が 2 つの 10 進数シーケンスと 1 文字を正常に処理したことをどのように確認できますか? これを使って:

int n = sscanf(buffer,"%d%d%c" ,&rdata.left_num, &rdata.right_num, rdata.op);
if (n == 3) {
    /* sscanf extracted and assigned three values;
     * One for each of the format specifiers,
     * and variables you passed in. Success! */
    printf("%d %c %d \n", ntohl(rdata.left_num),rdata.op,ntohl(rdata.right_num));
}
else {
    /* sscanf failed to extract some values from the string,
     * because the string wasn't correctly formatted */
    puts("Invalid input to sscanf");
}

...そして今、あなたは問題を見るでしょう! sscanf が失敗しました!

他の人が示したように、文字列は最初の'\0'(または 0) バイトで終了します。sscanf に渡すポインターは、空の文字列を指しています。sscanf は、空の文字列から必要な情報を抽出できません。

于 2013-04-06T02:32:04.647 に答える
2

sscanf他の多くの C ライブラリ関数と同様に、文字列が 0 ('\0' と同じ) になると文字列の繰り返しを停止します。配列の最初の要素bytesは 0 です。したがって、sscanf に関する限り、使用される入力文字列sscanf"". この動作の別の例を確認するには、whileループの後に次のコードを追加します。

printf("%s\n", bytes);

printflikeは文字列の末尾sscanfと見なされるため、これは何も出力しません (空の文字列を出力します) 。byte[0]

おそらく、このようなものを使用してデータを構造に読み込む必要があります- http://c-faq.com/stdio/extconform.html

于 2013-04-06T02:10:39.027 に答える
1

関数の説明によると ( http://www.cplusplus.com/reference/cstdio/sscanf/ ):

int sscanf ( const char * s, const char * format, ...);

最初の引数は次のようにする必要があります。

C string that the function processes as its source to retrieve the data.

ただし、各バイトを「16 進整数」として出力すると、次のようになります。

printf("bytes[%d] : %x \n", totalByte, buffer[++totalByte]);

最初のバイトの値は 0 です。したがって、文字列として扱うと、空の文字列になります。

于 2013-04-06T02:14:44.297 に答える