如何使用 sscanf 输入多个单词?

How to have multiple word input using sscanf?

假设我有:

char string[20][12];
string = "abcde bagfghabc cdfaga dnac eafagac cnaacaacaf"

我想使用 sscanf,使第一个、第三个和第五个单词在一个数组中,其他单词在另一个数组中。所以每2个字。 (12 是最大字长) 我试过

char odd[3][12];
char even[3][12];
int i = 0; 
while (i < 3) { 
   sscanf(string[i], odd[i], even[i]);
   i++;
}

非常感谢。

您正在尝试使用 sscanf 解决问题。然而,这个函数需要一个格式字符串作为第二个参数,而你似乎没有传递一个。

此外,在循环中调用 sscanf 时,在每次循环迭代中从字符串的开头开始解析是没有意义的。相反,您想告诉它在已经解析的单词末尾继续解析。因此,您必须引入一个额外的指针变量来跟踪已经解析了多少字符串,并且您必须在每次调用 sscanf 之后推进该指针。为此,使用 sscanf %n 格式说明符很有用。

这里有一个如上所述的解决方案:

#include <stdio.h>

#define MAX_WORD_PAIRS 3
#define MAX_WORD_SIZE 12

int main( void )
{
    char  odd[MAX_WORD_PAIRS][MAX_WORD_SIZE];
    char even[MAX_WORD_PAIRS][MAX_WORD_SIZE];

    char string[] = "word1 word2 word3 word4 word5 word6";

    char *p = string;
    int num_pairs;
    int characters_read;

    //attempt to read one pair of words in every loop iteration
    for ( num_pairs = 0; num_pairs < MAX_WORD_PAIRS; num_pairs++ )
    {
        //attempt to read a new pair of words
        if ( sscanf( p, "%s%s%n", odd[num_pairs], even[num_pairs], &characters_read ) != 2 )
            break;

        //advance pointer past the parsed area
        p += characters_read;
    }

    //processing is complete, so we can now print the results

    //print odd words
    printf( "odd words:\n" );
    for ( int i = 0; i < num_pairs; i++ )
    {
        printf( "%s\n", odd[i] );
    }

    printf( "\n" );

    //print even words
    printf( "even words:\n" );
    for ( int i = 0; i < num_pairs; i++ )
    {
        printf( "%s\n", even[i] );
    }
}

这个程序有以下输出:

odd words:
word1
word3
word5

even words:
word2
word4
word6