как поймать пустую строку между двумя \n\n

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

int main(int argc, char *argv[])
{
    char *token = NULL;

    char string1[] = "first Line\n\nthird line\nOne more line";

    token = strtok(string1, "\n");

    while (token != NULL) {
      size_t line = strlen(token);
      printf("Empty line%s\n", token);
      token = strtok(NULL, "\n");
    }

    return 0;
}

Вопрос: как распознать строку два, которая является пустой, между

first Line \n\n third line\n.


Ответы (2 шт):

Автор решения: Кирилл Малышев

Можно использовать функцию strsep.

int main(int argc, char *argv[])
{
    char *token;

    char string1[] = "first Line\n\nthird line\nOne more line";
    char buf[100];
    sprintf(buf, "%s", string1);
    char *end = buf;
    while ((token = strsep(&end, "\n")) != NULL) {
        if (token[0] == '\0') {
            printf("Empty token\n");
        } else {
            printf("%s\n", token);
        }
      token = end;
    }

    return 0;
}

Она не определена в стандарте, поэтому, если её на вашей платформе нет, можно воспользоваться такой реализацией:

#ifndef HAVE_STRSEP
char * strsep(char **sp, char *sep)
{
    char *p, *s;
    if (sp == NULL || *sp == NULL || **sp == '\0') return(NULL);
    s = *sp;
    p = s + strcspn(s, sep);
    if (*p != '\0') *p++ = '\0';
    *sp = p;
    return(s);
}
#endif
→ Ссылка
Автор решения: user7860670

Можно воспользоваться стандартной функцией strchr:

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

int main()
{
    char string1[] = "first Line\n\nthird line\nOne more line";
    char const sep = '\n';
    char * psz = string1;
    for (;;)
    {
        char * const token = strchr(psz, sep);
        if (token)
        {
            *token = '\0';
            printf("%s\n", psz);
            *token = sep;
            psz = token;
            ++psz;
        }
        else
        {
            printf("%s\n", psz);
            break;
        }
    }
    return 0;
}

online compiler

→ Ссылка