C中的sscanf可以写入char *而不是char []吗?

时间:2016-03-14 17:01:04

标签: c arrays pointers char scanf

我正在寻找标准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;
}

谢谢

3 个答案:

答案 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);
}

显然,您需要添加错误检查。