0

テキストファイルを1行ずつ読み、最初の17文字を印刷しようとしています。

FILE *devices;
devices = NULL;
devices = fopen("devices.txt", "r");

char deviceaddr[17];
char addr[17];

char line[1024];

while (fgets(line,1024,devices) != NULL)
{
    fscanf(devices,"%s", deviceaddr);

    printf("%s\n", deviceaddr);
}

fclose(devices);

00:07:80:4C:0E:EE出力は最初の行にあるはずですが、それはを与え6ます。

4

2 に答える 2

3

whileループはテキスト行を読み込んfscanfでから、次のテキスト セットを読み込みます (そして、そのバッファを偶発的にオーバーランさせる可能性があります)。ループ内の必要なデータを buffer から出力するだけでよいようですline

たとえば、3 行のテキストがあるとします。

00:07:80:4C:0E:EE    --> ends up line buffer line
second               --> ends up in deviceaddr
third line           --> ends up in line (unless the fscanf did not consume newline)       
于 2013-02-25T15:15:20.340 に答える
1

出力を にすることはできません"00:07:80:4c:0E:EE"。これは、バッファ オーバーランが原因で未定義の動作が発生するためです。文字列には 18 バイトが必要ですが、指定したのは 17 バイトだけです。長さを指定せずに anを使用しないでください。"%s"fscanf

そして、あなたはそれから一行読んだ後に電話fscanfをかけています。devices行ごとに読んでいる場合は、読んだ行で使用したいと考えて sscanfいます。

于 2013-02-25T15:17:46.270 に答える