1

私はファイルの解析に取り組んでおり、strtok()関数を使用してプロセスを支援しようとしています。テキスト ファイルからの次の抜粋を想像してください。

.text
main:
        lw $a0, array
        lw $a2, size
loop:
        add $t2, $a0, $t2
        sw $t0, 0($t2)
        bne $t3, $zero, loop

        li $v2, 8
        syscall

.data
array:    .word 0:10
message: .asciiz "Hello"

現在、このようなファイルを 1 行ずつ取得しています。main:、、、、のように末尾にコロンが含まれる行がある場合に知りloop:たいarray:ですmessage:

そのために、このコードを使用してみました。

char *token;
token = strtok(line, ":");
if (token != NULL)
{
        //Do things with the token I grabbed
}

したがって、strtok一度だけ呼び出してトークンとして保存すると、区切り文字が行に存在する場合にのみトークンの値を保存していると想定しました。それ以外の場合、トークンは NULL になります。したがって、トークンがnullでないかどうかを確認すると、トークンに「:」が含まれている行が確実にあるため、最初に必要だった行を取得できると思いました。

このコードが私のプログラムで実行されると、すべての行の最初の「単語」が取得され、トークンとして保存されます。また、何もない行 (空白行) については、NULL と見なされないため、ガスを節約できます。

これは少し混乱を招く可能性があるため、明確化が必要な場合はお知らせください。

4

1 に答える 1

1

strtok(":")を含まない行の場合:、 は取得されずNULL、基本的には行のみが取得されます。したがって、使用している方法は機能しません。

文字列が で終わるかどうかだけを確認したい場合は:、次を使用できます。

int len = strlen (str);
if ((len > 1) && (str[len-1] == ':'))
    itEndsWithAColon();

これを行う前に、末尾の空白を削除する必要がある場合があることに注意してください (\nで行を取得した場合を含むfgets)。これを行う 1 つの方法は、次のような関数に全体を移動することです。

#include <ctype.h>
int endsWithColonIgnoreWs (char *str) {
    char lastnonws = *str++;
    if (lastnonws != '\0') {
        while (*str != '\0') {
            if (! isspace (*str))
                lastnonws = *str;
            str++;
        }
    }
    return (lastnonws == ':');
}
于 2015-10-15T08:36:21.270 に答える