1

私がやろうとしているのは、区切り文字として空白を使用してユーザー入力を分割し、その部分を配列 ( ) にコピーし、 (最初の部分) が と等しい場合にtokenAr比較することです。それらが等しい場合は、配列に入力された対応するコマンドを実行するために、値が「1」、「2」などであるかどうかを確認します。これは私がこれまでに試したことであり、クラッシュします。Windows x64 で TCC を使用しています。編集: ちょうど 2 日前に C を学び始めたことを忘れていました。tokenAr[0]sHistorytokenAr[1]history

EDIT2:プログラムをデバッガーで実行するとAcces Violation(Segmentation Fault)、インラインが発生しましたif(strcmp(tokenArPtr[0],sHistory)==0)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{   
    int i=1; int j=1; int k=0;
    char history[100][100] = {0};
    char sKey[] = "exit";
    char sInput[100];
    char sHistory[]="history";

    do 
    {
        //gather user input
        printf ("hshell> ");
        fgets (sInput, 100, stdin);
        strcpy(history[i],sInput);
        i++;
        //END_gather user input

        //Tokenizing

        char delims[] = " ";
        char *tokenArPtr[5];
        char *result = NULL;

        result = strtok(sInput, delims);
        tokenArPtr[0] = result;

        while (result!=NULL)
        {
              puts(result);
              result= strtok(NULL, delims);
              tokenArPtr[k+1] = result;

              puts(tokenArPtr[k]);
              puts("=====");
              k++;
        }
         k=0;
        /*
        //END_Tokenizing

        if(strcmp(tokenArPtr[0],sHistory)==0)
        {   
            for(j=1;j<i;j++)
            {
                printf("%d. %s \n",j,history[j]);
            }
        }

        else if (strcmp (sKey,tokenArPtr[0]) != 0)
        {
            printf("\nCommand not found \n");
        }*/
     }while (strcmp (sKey,sInput) != 0);  
    return 0;
}

編集 3:直接resultの代わりに変数を使用しましtokenArPtrたが、デバッグ時に、配列の値が更新されていないことに気付きました。

4

3 に答える 3

0

トークン化中、テストは変更されない変数「result」で行われるため、ループは終了しません...したがって、最終的に「tokenAr」でバッファオーバーフローが発生します...「tokenAr」をテストするようにコードを変更します。

編集:そしてtokenARは配列でなければなりません...(私はそれがどのようにコンパイルできるかわかりません...)

于 2013-02-19T09:09:05.730 に答える
0

多くの問題があります...まず、コンパイル時にいくつかのエラーを表示するstring.hを含める必要があります。

主な問題はここにあると私は信じています:

    char tokenAr[2];
        result = strtok(sInput, delims);
        while (result!=NULL)
        {
                tokenAr[k] = strtok(NULL, delims);
                k++;
        }

tokenArは、charではなくポインタの配列である必要があります。そして、kが2を超えることは決してないだろうか?アサーションはデバッグに役立ちます。

于 2013-02-19T09:09:09.110 に答える
0

strtok はどの型を返しますか? char *. tokenAr[k]の型は何ですか? char. strcmp が入力として期待する型は何ですか? char *char *。tokenAr[0]の型は何ですか? char.

問題がありますか?あなたがすべき。は*かなり重要です。

tokenAr が のようchar *tokenAr[2];に宣言されていると仮定すると、tokenAr はいくつのchar *値を格納できますか? k が 2 を超えるとどうなりますか? tokenAr 配列がオーバーフローしないようにする必要があります。

history初期化されていません。初期化されていない変数を使用すると、未定義の動作になります。次のように初期化することをお勧めします。char history[100][100] = { 0 };

あなたはどの本を読んでいますか。

于 2013-02-19T09:08:37.630 に答える