0

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

字符数组是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
4

3 回答 3

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.

于 2012-06-07T07:21:57.850 回答
1

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

strtok 示例

于 2012-06-07T08:16:31.303 回答
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;
}
于 2012-06-07T07:20:34.643 回答