0

このコードは奇妙なものを出力するため、このコードを修正するのに助けが必要です。

ワイヤレス ツールと iwlib.h を使用してワイヤレス ネットワークをスキャンし、その ESSID を取得しました。私が使用する場合:

printf("Network name %s:", result->b.essid);

次に、それは魅力のように機能し、名前を出力してくれます。ただし、後でネットワーク経由でバッファ経由で送信できるように、それを char に変換したいと考えています。

(結果を送信できず、「名前の抽出」が反対側で発生する可能性がある場合を除きますか?それとも不可能ですか?)

以下のサンプル コード (完全なコードではありません) を参照してください。

wireless_scan_head head;
wireless_scan *result;
iwrange range;


while(result != NULL)
{
    char *network;
    network = result->b.essid;
    int k;
    int size = strnlen(result->b.essid);
    printf("\n Network ESSID:");
    for(k=0; k<=size; k++)
    {
        printf("%c", network[k]);
        k++;
    }
    result = result->next;
}

助けてくれてありがとう!

4

2 に答える 2

4

あなたが抱えていると思っている問題とは、まったく別の問題です。何が起こっているかというと、あなたは決して初期化していないresultので、次のようになります:

network = result->b.essid;

ゴミを与えるだけで、これは次のとおりです。

result = result->next;

おそらく無限ループになります。

おそらく、コンパイラの警告レベルを上げるか、splint や Valgrind などのツールを調べる必要があります。

于 2013-07-24T01:31:12.440 に答える
3

物事を形式化するためだけに...

forループ内とfor宣言内でkをインクリメントしています。1 文字おきに出力し、実際に network[] の境界を越えて読み取ります。(あなたはとても疲れていると言いました...それで十分です!)

別のこととして、strnlen 関数を使用していますが、最大長を指定していません。問題を表示するために、常に -Wall -Wextra および場合によっては -Wunused でコンパイルすることを強くお勧めします。細心の注意を払い、-Werror も使用し、表示された警告とエラーを修正します。より良いコードを記述し、より良い習慣を身につけることができます。

もう1つ、strlen(またはstrnlen)関数を使用して長さを決定できる場合、ループは冗長です。シンプル:(あなたが最初に指摘したように)

printf("Network ESSID: %s\n", result->b.essid);

十分でしょう。

essid はおそらく構造体で'char essid[xx];' のいずれかとして定義されています。、または (より良い) 'char* essid;' 、これは既にchar 文字列であることを意味します。(Cの「文字列」は、C++ の「文字列文字列」と同じ方法で格納されません)

{にやにや}本当にそのように書きたい場合:

while (result != NULL) {
    char *network = result->b.essid;
    /* string length is unsigned */
    size_t size = strlen(network);
    /* so we need an unsigned index to compare */
    unsigned int k;
    /* initial part of output */
    printf("Network ESSID: ");
    for (k = 0; k <= size; ++k) {
        /* printf is overkill for a single char */
        putchar(network[k]));
    }
    /* terminating CR/LF/CRLF, printf overkill again */
    puts(NULL);
    result = result->next;
}

そして短いバージョン:

while (result != NULL) {
    printf("Network ESSID: %s\n", result->b.essid);
    result = result->next;
}

あなたのコードをよろしくお願いします!

于 2013-07-24T20:35:08.320 に答える