1

getline() を使用してキーボードから入力を取得し、それを文字列に格納し、トークン化し、トークンを出力しようとしています。これを実行すると、最後の反復 (入力からの最後のトークンを処理する反復) でセグメンテーション違反エラーが発生します。

#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

////////////////////////
// Main Method        //
////////////////////////
void main() {
    system("clear");
    int ShInUse = 1; // Represents if shell is in use

    char curpath[1024];   // holds current path to print with prompt
    char *UserCommand = NULL;
    size_t combytes = 100;
    UserCommand = (char *) malloc(combytes);
    char *tok;

    // Main loop that shell uses //
    while (ShInUse == 1) {
        getcwd(curpath, sizeof(curpath)); // Store initial working dir
        printf("gash:%s>", curpath);   // print prompt

        getline(&UserCommand, &combytes, stdin);
        tok = strtok(UserCommand, " \n");   // Tokenize input
        if (tok == NULL ) {
            printf("Enter a command.\n");
        } else {
            // Exit command //
            if (strcmp(tok, "exit") == 0) {
                ShInUse = 0;
            } else {
                while (tok != NULL ) {
                    printf("You entered a command.\n");
                    printf("tok: %s\n", tok);
                    tok = strtok(NULL, " \n");
                }
            }
        }
    }
    free(UserCommand);
}

これを引き起こしている可能性があるものについてのアイデアはありますか? 現時点では、デバッグはオプションではありません。

4

2 に答える 2

3

私はこれであなたのコードをテストしました:

#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char *UserCommand = NULL;
    size_t combytes = 100;
    UserCommand = (char *) malloc(combytes);
    char *tok;
    while(getline(&UserCommand, &combytes, stdin) != EOF)
    {
    tok = strtok(UserCommand, " \n");    // Tokenize input
    if (tok != NULL) {
        while(tok != NULL) {
        printf("%s\n", tok);
        tok = strtok(NULL, " \n");
        }
    }
    }
    return 0;
}

ソースファイルを入力として渡す、かなり長い行を書くなど、私が行ったすべてのテストで問題なく動作します。

したがって、私の結論は、コードにセグメンテーション違反を起こす ELSE がおそらくあるということです。

于 2013-03-02T20:04:23.063 に答える
0

また、答えではなく、プログラミングスタイルの別のオプションです。

私があなたのようなトークン化ループを持っているときはいつでも、私はそれらを次のように構築することを好みます:

for( tok = strtok( UserCommand, " \n" );
     tok != NULL;
     tok = strtok( NULL, " \n" ) )
{
   printf( "%s\n", tok );
}

これにより、両方のstrtok()呼び出しが近くに保たれ、NULLテストを1回だけ作成する必要があります。あなたのやり方は大丈夫です、これはただの別の選択肢です。幸運を!

于 2013-03-02T20:22:48.863 に答える