我正在寻找标准C中解析字符串的最简单方法。字符串中的单词数是固定的,但每个单词的长度不是。代码将在内存有限的微处理器上运行,所以我不能只分配一个过度杀伤缓冲区,我只想分配我需要的内存。
以下代码有效,但我希望单个单词为char *。有什么方法可以解决这个问题吗?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char * my_words = "foo bar 1 2";
char word1[20];
char word2[20];
char word3[20];
char word4[20];
int match = sscanf(my_words,"%s %s %s %s",word1,word2,word3,word4);
printf("Matches: %d\r\n",match);
printf("%s\r\n",word1);
printf("%s\r\n",word2);
printf("%s\r\n",word3);
printf("%s\r\n",word4);
return 0;
}
谢谢
答案 0 :(得分:1)
对于解析,您可以使用strtok()函数。一个简单的方法可以像你也可以修改它
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char const *my_words = "foo bar 1 2";
char *str = malloc(1 + strlen(my_words));
strcpy(str, my_words);
int countWord = 0;
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ");
++countWord;
}
printf("Total words = %d\n", countWord);
return 0;
}
答案 1 :(得分:1)
答案取决于您的代码应该是多么简单和标准。
如果您的目标支持POSIX 2008(最近的GNU libc),那么您可以使用m
修饰符作为docs suggest来分配足够的空间来读取数据。
但是如果你必须继续使用ANSI C,那么你可能会遇到像strtok
/ strtok_r
这样的函数或类似函数。
答案 2 :(得分:0)
如果您必须自己动手,算法就是这样:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
/* your input, I'll presume its constant */
const char *input = " foo bar 1 2 ";
/* here is your array of char*.
* you indicate the number of words is fixed */
char *words[4];
/* the algo */
size_t b = 0;
size_t e = 0;
size_t l = strlen(input);
int w = 0;
while (b < l) {
b += strspn(input + b, " ");
e = b + strcspn(input + b, " ");
words[w] = malloc(e - b + 1);
strncpy(words[w], input + b, e - b);
w++;
b = e+1;
}
/* debugging, outputs in reverse order */
while (w--) {
printf("%s\n", words[w]);
free(words[w]);
}
exit(EXIT_SUCCESS);
}
显然,您需要添加错误检查。