1

次のコード行では、キー文字列が文字列内に見つかった場合に、変数文字列をキー文字列に置き換えようとしています。たとえば、文字列「hello VARIABLE world」がある場合、KEY 値が VARIABLE 値の代わりに配置され、元の文字列ではなく文字列「hello KEY world」が作成されます。そのための私の理論は、(文字列内の) 変数の最初の文字まで文字列をトークン化し (newfirst)、変数文字をトークン化し (newtrash)、文字列の残りをトークン化する (newsecond) というものでした。次に、newfirst + key + newsecond を連結します。問題は、myVariables[i].variable[0] と myVariables[i].variable[varlength - 1] が最初の 2 行で strtok 関数に char として読み込まれ、コンパイラが const char* を要求していることです。

これを表現する簡単な方法: strtok 関数の区切り文字として、char 配列 (ユーザー入力なのでハードコーディングできない) から個々の char を渡すにはどうすればよいですか?

** 明確にするために、これはプログラム全体ではなく、問題への関心のある行にすぎません

  strcpy(newfirst, strtok(testString, myVariables[i].variable[0]));
   strcpy(newtrash, strtok( NULL, myVariables[i].variable[varlength - 1]));
   strcpy(newsecond, strtok(NULL, "\n"));
   strcat(newfirst, myVariables[i].key);
   strcat(newfirst, newsecond);


  struct variablePairs {
     char variable[20];                 
     char key[20];                  
 };
4

2 に答える 2

3

あなたはそうしない。Strtok はおそらくあなたがやろうとしていることの正しい解決策ではなく、それが何をするのか誤解しているようです. へのdelim引数strtokは、実際には文字列として表現された文字のセットです。 strtok区切り文字列にある単一の文字が見つかるまで入力文字列をスキャンし、区切り文字の開始と見なします。次に、区切り文字列内の任意の場所にある追加の文字を探し、それらも区切り文字と見なします。

何をしようとしているのかはまったく明確ではありませんが、部分文字列を検索して、VARIABLEそれを他の文字列に置き換えているようです。 strstrおそらくあなたがここで欲しいものです。何かのようなもの:

if ((p = strstr(input, myVariables[i].variable))) {
    strncpy(output, input, p-input);
    strcat(output, myVariables[i].key);
    strcat(output, p+strlen(myVariables[i].variable));
} else {
    /* variable not found */
    strcpy(output, input);
}

これにより、別の単語に埋め込まれている場合でも、変数文字列が検出されます。これを回避したい場合は、一致がスペースで囲まれているか、文字列の最後にあるかを確認する必要があります。

len = strlen(myVariables[i].variable);
if ((p = strstr(input, myVariables[i].variable)) &&
    (p == input || isspace(p[-1])) &&
    (isspace(p[len]) || p[len] == 0))

数字と句読点をどのように扱いたいかによって、isspace呼び出しを!isalphaまたはに置き換えたい場合があります。!isalnum

于 2012-11-12T07:00:51.880 に答える
0

これは問題を解決するための最良の方法ではありません。

1.ポインタを宣言し、最初または最後の文字をそのポインタに渡します。

2. const charに解析できるように、「\0」で終了することを忘れないでください。

3. strtokで(const char *)pフォームを使用します。

char x[256]={0};
char *p;

p = malloc(2);
strcpy(x,"abcd");
*p = x[0];
memset(p+1,'\0',1);

printf("\n point p is %s\n",(const char *)p);

出力:

point p is a
于 2012-11-12T06:44:04.903 に答える