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

您当前的代码似乎太复杂了。这是一个三步算法,如果我编写它,我将实现它:

  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 回答