【问题标题】:how can i split strings from Character Array如何从字符数组中拆分字符串
【发布时间】:2012-06-07 06:55:53
【问题描述】:

这里我有一个字符数组,其中有一些拆分器。

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

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

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

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

如果我用%s = %s 阅读abc = 12,那么它的工作原理。为什么我们必须在拆分器之间留出空间。

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

代码无效:

#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

【问题讨论】:

标签: c string split scanf


【解决方案1】:

当指定这样的格式时:%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 个字符('\0' 为 20 个)并阻止字符 '_' 成为 str0 的一部分。因此,输出会根据需要变为abc --&gt; 12 --&gt; 22 --&gt; 32 --&gt; 42

您也可以使用strtok

【讨论】:

    【解决方案2】:

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

    strtok example

    【讨论】:

      【解决方案3】:

      将','和'-'替换为'',还需要一个数组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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-12
        • 1970-01-01
        • 2020-12-01
        • 2018-06-03
        相关资源
        最近更新 更多