В строковом литерале, используемом в качестве инициализатора
char string[100] = "word1 word2 word3 word4 word5 word6 word7\0";
явный завершающий ноль является избыточным. Строковый литерал уже содержит конечный ноль, кроме явного конечного ноля.
Вот, пожалуйста.
#include <stdio.h>
int main(void)
{
char string[100] = "word1 word2 word3 word4 word5 word6 word7";
char s[10];
const char *p = string;
for ( int n = 0; sscanf( p, "%s%n", s, &n ) == 1; p += n )
{
puts( s );
}
return 0;
}
Вывод программы:
word1
word2
word3
word4
word5
word6
word7
Другой подход заключается в использовать либо стандартную функцию strtok
, либо пару функций strcspn
и strspn
.
Например,
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[100] = "word1 word2 word3 word4 word5 word6 word7";
const char *delim = " \t";
const char *p = strtok( string, delim );
while ( p != NULL )
{
puts( p );
p = strtok( NULL, delim );
}
return 0;
}
Вывод программы такой же, как показано выше.
А вот демонстрационная программа, которая использует стандартные функции strcspn
и strspn
.
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[100] = "word1 word2 word3 word4 word5 word6 word7";
const char *delim = " \t";
for ( const char *p = string; *p; )
{
p += strspn( p, delim );
const char *q = p;
p += strcspn( p, delim );
int n = p - q;
if ( n ) printf( "%*.*s\n", n, n, q );
}
return 0;
}
Снова вывод будет таким же, как показано выше.
Pay Обратите внимание, что в этом случае извлеченные слова не заканчиваются нулем. Поэтому, чтобы скопировать их в массив символов в виде строк, вы должны использовать memcpy
, а затем добавить скопированные символы с завершающим нулем.