我正在尝试将句子标记为仅由单个空格分隔的单词。 我需要从句子中获取单词然后将它们写入订阅数组。 这是我的工作:
void writeToStrArrayOneByOne(char words[10][20], char *sentence){
char *tokenPtr;
int j = 0;
int a,i;
tokenPtr = strtok(sentence," ");
while(tokenPtr != NULL){
a = strlen(tokenPtr);
for(i=0;i<a;i++){
words[j][i] = tokenPtr[i];
}
tokenPtr = strtok(NULL," ");
j++;
}
我只用这个来调用函数,以便从main调试:
char words[10][20];
char *sentence = "this is a token";
writeToStrArrayOneByOne(words,sentence);
然而,当它出现EOF异常时会冻结。 感谢任何帮助,谢谢。
答案 0 :(得分:4)
strtok()
修改它传递的字符串。你给它一个无法修改的字符串文字。
尝试:
char sentence[] = "this is a token";
这将使sentence
成为可修改的字符数组。
还要记住,复制令牌的循环不会在每个条目的末尾放置一个空终止符 - 我怀疑你可能会想要那些。也许试试:
strcpy(words[j], tokenPtr);
您应该考虑的其他事项包括:
strtok()
如果对你很重要则不处理(我提到这只是因为在你的问题中你特别提到令牌是“仅由一个空格分隔“)答案 1 :(得分:1)
好吧,也许这可以帮到你:
char** split (char* string, const char* delim) {
char* p;
int i = 0;
char** array;
array = malloc(strlen(string) * sizeof (char*));
p = strtok (string, delim);
while (p != NULL) {
array[i] = malloc(sizeof(char) );
array[i++] = p;
p = strtok(NULL, delim);
}
return array;
}
然后在main
:
char s[128] = "Est2,2011,11,02,00,10,madrid,-3.467,44.3578,17.0";
char **array = split(s, ",");
int i = 0;
while (*array){
printf("[%s]\n", *array++);
i++;
}
希望它有所帮助。
答案 2 :(得分:1)
请记住,字符串以'\ 0'结尾作为分隔符,这意味着其中带有“a”的数组arr是2个字符长(arr [0]是'a',arr [1]是'\ 0'你可能想写。
a = strlen(tokenPointer) + 1
strncopy也可能有用,它的strcopy带有第三个参数,即要复制的字符串长度。
它将为您节省循环字符串,简化您的功能可能对您有价值。
enrmarc是正确的,动态分配内存是你可能采用的一种方式,你需要一个不规则的数组,你需要的确切大小。您还可以调用指向字符串IE char * stringArr [10]的指针数组,然后将stringArr [0]分配给您的第一个令牌,依此类推。我会假设这不是你想要的。
按照Michael Burr的建议,你的功能定义应该更像是:
void writeToStrArrayOneByOne(char words[][], char sentence[])
最后,调试很难,我没有完全回答你的问题。使用一些预处理器宏可以更轻松。尝试使用以下内容:
#define PRINT_CVAL(a) printf(#a "contains %c\n", a)
您可以将CVAL中的C和%c更改为I,将%d更改为整数,依此类推,它可以帮助您了解程序中存在问题的位置。