1

大丈夫。したがって、このプログラムを C で作成し、引数と値を含む文字列を取得します (「GO 45 STOP 15」など)。目標は、文字列を解析し、引数を対応する値と共に typedef 構造体に配置して、後で操作できるようにすることです。

これは私の構造がどのように見えるかです:

typedef struct {
    char* keyword;
    double value;
} parameter;

問題が発生しているコードのコピーをいくつか示します。main() と initParams() の両方が同じファイルにあるため、どちらも同じ #defines にアクセスできます...

主要():

#include <stdio.h>
#include <stdlib.h>
#include "findArgs.h"

#define STR0_SIZE 80
#define LIST_SIZE   4
#define MAX_PARAMS 15

void main(){
int i;

char str0[STR0_SIZE] = "LEFT 45 GO 686 GO 34.3 STOP 56 RIGHT 26";   //Input String
char* wordList[LIST_SIZE]={"GO", "STOP", "LEFT", "RIGHT"};

int num_arg = 0; //Number of arguements in str0 (each space denotes the end of an arg)

parameter* param;
initParams(param);

replaceSpaces(str0, &num_arg);

findWords(param, str0, num_arg);
}

initParams:

void initParams(parameter* param){
int ctr0, ctr1;

param = (parameter*) malloc(MAX_PARAMS * sizeof(parameter));
printf("\n%i\n", sizeof(parameter));
for(ctr0=0;ctr0<MAX_PARAMS;ctr0++){
        param[ctr0].keyword = "";
        param[ctr0].value = 0;
}

いくつかの簡単な説明があります。initParams は、各パラメーターにメモリを割り当てるためのものです。文字列に含まれるパラメーターの数がわからず、プログラムの後半で文字列の数を決定する予定であると想定しています。文字列内のパラメーターを超えるものを受け入れないことはわかっています。
メモリを割り当てた後、それぞれをループし、各値を空の文字列または 0 に初期化します (これはおそらく不要であることは認識していますが、コードのトラブルシューティングの一環としてこれを実行しました。

続いて、replaceSpaces() は単純に文字列をループし、出現する ' ' を '\0' に置き換えます。また、文字列内に存在する引数の数もカウントするため、null ターミネータを追加して作成したばかりの新しい文字列の数がわかります。

今、私が苦労しているトリッキーな部分です。

#define MAX_ARG_LENGTH 20

void findWords(parameter* param, char* str0, int num_arg){
parameter temp[countWords(str0, num_arg)];
int i;
int ctr0,ctr1, ctr2=0;
int word=0; //flag
char tempStr[MAX_ARG_LENGTH]="";
char* c0 = str0;

for(ctr0=0; ctr0<num_arg; ctr0++){
    word=0;
    ctr1=0;
    if(((*c0 > 'a') && (*c0 <'z')) || ((*c0 > 'A') && (*c0 <'Z'))){
        word=1;
        tempStr[ctr1]=*c0;
        ctr1++;
    }
    while(*c0 != '\0'){
        c0++;
        if(word)
            tempStr[ctr1++] = *c0;
        printf("\ntempStr: '%s'\n", tempStr);
    }
    if(word){
        param[ctr2].keyword = tempStr;
        printf("%s\n", param[ctr2].keyword);
        ctr2++;
    }
    c0++;
}
    for(i=0; i<num_arg/2;i++){
        printf("'%s'\n", param[i].keyword);
        printf("'%g'\n", param[i].value);
}


}

この関数は、文字列内の各単語を検索して tempStr に格納する際に適切に機能します。私の問題は、それを main() のパラメーター配列に割り当てることです。それらをパラメーターの一時配列に割り当ててから、「param」を一時配列に等しく設定しようとしました。ただし、param はポインターであるため、ローカルの場所に割り当てると、関数の終了後にメモリが解放されて失われます。malloc を使用してそれらのメモリを事前定義し、後で割り当てるという私のアイデアを入力してください。

これは、コードをコンパイルして実行したときの現在の出力です。明確にするためにコメントを追加しました

16 //sizeof(パラメータ)

5 //str0 の単語数

行く

行く

止まる

'RIGHT' //一重引用符で囲まれたものは、パラメーターの配列から出力されます

「8.05316e-315」

'右'

'0'

'右'

「8.04051e-315」

'右'

'0'

'右'

'0'

MAIN: //findWord() で見られるのと同じ for ループを使用して、これらを main に出力しました。

「▒▒」

「8.05316e-315」

「▒▒」

'0'

「▒▒」

「8.04051e-315」

「▒▒」

'0'

「▒▒」

'0'

main で宣言された配列のパラメーターに tempStr の内容を適切に割り当てるのを手伝ってくれる人がいれば、とても感謝しています。さらに情報が必要な場合はお知らせください。

皆さん、ありがとうございました!!わかった!!!

「tempStr」を作成するのではなく、文字を param[index].keyword に直接割り当てました。それは魅力のように働いた

どうもありがとうございました!以前にさまざまな Q と As here を読んだことがありましたが、投稿するのはこれが初めてでした。皆様の迅速なご回答に大変興奮しております。

再度、感謝します!

〜ニック

4

1 に答える 1

0

文字列をそこparam[ctr2].keyword = tempStr;にコピーするのではなく、 を指すだけです。つまり、すべてのキーワードが変数を指し、この関数の外でアクセスすると無効になります。tempstrkeywordkeywordtempstrtempStr

やりたいことは作ること

char* keyword;

の中へ

char keyword[MAX_ARG_LENGTH];

strcpyまたはのようなものを使用strncpyして、コピーを行います。

valueまた、どこにも設定していないようです

于 2012-12-16T01:45:48.857 に答える