1

文字列の配列があり、各文字列をいくつかの異なる部分に分ける必要があります。文字列には、任意のスペースとタブが含まれる場合と含まれない場合があります。

Example string:
str[0]: "   apple  e     3   a     a fruit    "
I need it to become:
word[0] = "apple"
row[0] = "e"
column[0] = "3"
direction[0] = "a"
clue[0] = "a fruit"

そのため、先頭/末尾の空白、およびフィールド間にある空白を削除する必要があります (手がかりフィールドを除く。手がかり内のスペースは保持する必要があります)。これを行う方法が本当にわかりません。私にはいくつかの基本的なアイデアがありますが、それらを実装する方法がわかりません。また、実行可能かどうかもわかりません (コーディングが初めてで、まったく無知です)。これまでに試したことはすべて、コンパイルできないか、機能しませんでした。

最初のフィールドを引き出すための私の最近の試み:

for (i=0; i<MAX_LENGTH; i++) {
   for (j=0; j<MAX_INPUT; j++) {
      if (isSpace(&input[i][j]) == FALSE) {
      //if whitespace is not present, find the location of the next
      //space and copy the string up til there
         static int n = j;

         for (n=0; n<MAX_INPUT; n++) {
            if (isSpace(&input[i][n]) == TRUE) {
               strncpy(word[i],&input[i][j],(n-j));
               //printf("Word[%d]: %s\n",i,word[i]);
               break;
            }
         }

      }
   }
}

うまくいかなかったとしても、それほど驚くことではありません。私はまだこの問題に頭を悩ませていません。助けてください?

4

4 に答える 4

1

現在のコードは複雑すぎるようです。これをコーディングする場合に実装する 3 段階のアルゴリズムを次に示します。

  1. 現在の文字がスペースの場合: 次の文字に移動します。
  2. 現在の文字がスペースではない場合: 出力に追加し、次の文字に移動します。
  3. 入力文字列の最後に到達するまで、手順 1 と 2 を繰り返します。
于 2012-05-28T07:33:49.140 に答える
0

単にsscanfを使用して、空白で区切られた「単語」を読み取ります。

char str[][100] = { "   apple  e     3   a     a fruit    ", ... }
char word[100][100],row[100][100],column[100][100],direction[100][100],clue[100][100];
int i;

for( i=0; i<...; ++i )
  sscanf(str[i],"%s%s%s%s%[^\n]",word[i],row[i],column[i],direction[i],clue[i]);
于 2012-05-28T07:58:16.837 に答える
0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char *trimEnd(char *str){
    char *p;
    if(str == NULL || *str == '\0') return str;
    p=str+strlen(str);
    while(isspace(*--p) && p >= str){
        *p = '\0';
    }
    return str;
}

int main(){
    char str[100][100] = { "   apple  e     3   a     a fruit    " };
    char word[100][100], row[100][100], column[100][100], direction[100][100], clue[100][100];
    const char *delim= " \t";
    int i;
    const dataSize = 1;//for sample

    for(i=0;i<dataSize;++i){
        char *pwk, *p = strdup(str[i]);
        strcpy(word[i], strtok(p, delim));
        strcpy(row[i], strtok(NULL, delim));
        strcpy(column[i],strtok(NULL, delim));
        strcpy(direction[i], pwk=strtok(NULL, delim));
        pwk = pwk+strlen(pwk)+1;
        strcpy(clue[i], trimEnd(pwk+strspn(pwk, delim)));
fprintf(stderr,"DEBUG:%s,%s,%s,%s,%s.",word[i],row[i],column[i],direction[i],clue[i]);
        free(p);
    }

    return 0;
}
于 2012-05-28T11:00:10.413 に答える
-1

機能を使用できますstrtok_r
文字列をトークンに分割し、選択したもので区切ります。

const char *delim= " \t";
char *tok = NULL;

word[0] = strtok_r(str[0],delim,&tok);
row[0] = strtok_r(NULL,delim,&tok);
column[0] = strtok_r(NULL,delim,&tok);
direction[0] = strtok_r(NULL,delim,&tok);
clue[0] = strtok_r(NULL,"",&tok);  // delim="" - won't break by whitespace
于 2012-05-28T07:38:51.707 に答える