我如何从字符数组中分割字符串

时间:2012-06-07 06:55:53

标签: c string split scanf

这里我有一个角色arrray,其中有一些分离器。

字符数组是char sentence []="abc_12.22.32.42";

我想使用sscanf从句子中读取abc,12,22,32,42。

我尝试使用sscanf,但它的输出不同。

我在这里发布了两个代码,其工作正常。

如果我用abc = 12阅读%s = %s,那么它就可以了。为什么我们必须在分离器之间留出空间。

实现这一目标的任何方式。

不工作代码:

#include <stdio.h>

int main ()
{
  char sentence []="abc_12.22.32.42";
  char str [20];
  char str1 [20];
  char str2 [20];
  char str3 [20];
  sscanf (sentence,"%s_%s.%s.%s.%s",str,str1,str2,str3);
  printf ("%s --> %s --> %s --> %s --> %s\n",str,str1,str2,str3);
  return 0;
}

输出:

abc_12.22.32.42-->  -- � -->�Tl�s --> (null)

预期产出:

 abc --> 12 --> 22 --> 32 --> 42

工作代码:

/* sscanf example */
#include <stdio.h>

int main ()
{
  char sentence []="abc = 12";
  char str [20];
  char str1 [20];
  char str2 [20];
  char str3 [20];
  if(sscanf(sentence,"%s = %s",str,str1) < 5) ;
        printf ("%s--> %s\n",str,str1);
  return 0;
}

输出:

abc--> 12

3 个答案:

答案 0 :(得分:3)

当指定格式为%s_%s.%s.%s.%s时,您的程序无法知道第一个字符串不能包含字符'_''.'。这就是sscanf(sentence,"%s_%s.%s.%s.%s", str0, str1, str2, str3, str4);导致整个句子存储在str0中的原因。

如果您希望与sscanf保持联系,则必须更改您期望的格式:

char sentence[] = "abc_12.22.32.42";
char str0[20], str1[20], str2[20], str3[20], str4[20];
sscanf (sentence,"%19[^_]_%19[^.].%19[^.].%19[^.].%19[^.]",
        str0, str1, str2, str3, str4);
printf ("%s --> %s --> %s --> %s --> %s\n",
        str0, str1, str2, str3, str4);

%19[^_]会导致str0包含最多19个字符(20个'\0'}并阻止字符'_'成为str0的一部分。因此,输出根据需要变为abc --> 12 --> 22 --> 32 --> 42

或者您可以使用strtok

答案 1 :(得分:1)

使用strtok功能。这是分割字符串的最佳方式

strtok example

答案 2 :(得分:0)

用''替换','和' - ',还需要一个数组str4

#include <stdio.h>
#include <string.h>

int main ()
{
    char sentence []="abc_12.22.32.42";
    char str [20];
    char str1 [20];
    char str2 [20];
    char str3 [20];
    char str4 [20];

    int i;
    for (i=0; i<strlen(sentence); i++) {
        if (sentence[i] == '_') sentence[i] = ' ';
        if (sentence[i] == '.') sentence[i] = ' ';
    }

    sscanf (sentence,"%s %s %s %s %s",str,str1,str2,str3, str4);
    printf ("%s--> %s --> %s -->%s --> %s\n",str,str1,str2,str3, str4);
    return 0;
}