Как разделить строку к 2 строкам в C

Я задавался вопросом, как Вы могли взять 1 строку, разделите ее на 2 с разделителем, таким как пространство, и отведите эти 2 роли 2 отдельным строкам. Я попытался использовать strtok() но напрасно.

38
задан Spikatrix 8 May 2016 в 11:17
поделиться

7 ответов

#include <string.h>

char *token;
char line[] = "SEVERAL WORDS";
char *search = " ";


// Token will point to "SEVERAL".
token = strtok(line, search);


// Token will point to "WORDS".
token = strtok(NULL, search);

Обновление

Обратите внимание, что в некоторых операционных системах на странице руководства strtok упоминается:

Этот интерфейс устарел strsep (3).

Пример с strsep показан ниже:

char* token;
char* string;
char* tofree;

string = strdup("abc,def,ghi");

if (string != NULL) {

  tofree = string;

  while ((token = strsep(&string, ",")) != NULL)
  {
    printf("%s\n", token);
  }

  free(tofree);
}
56
ответ дан 27 November 2019 в 03:29
поделиться

Если вы готовы изменить исходную строку, вы можете просто заменить разделитель на \ 0 . Исходный указатель будет указывать на первую строку, а указатель на символ после разделителя укажет на вторую строку. Хорошо, что вы можете использовать оба указателя одновременно, не выделяя никаких новых строковых буферов.

1
ответ дан 27 November 2019 в 03:29
поделиться

Для подобных целей я обычно использую strtok_r () вместо strtok ().

Например ...

int main (void) {
char str[128];
char *ptr;

strcpy (str, "123456 789asdf");
strtok_r (str, " ", &ptr);

printf ("'%s'  '%s'\n", str, ptr);
return 0;
}

Это выведет ...

'123456' '789asdf'

Если требуются другие разделители, то выполните цикл.

Надеюсь, это поможет.

11
ответ дан 27 November 2019 в 03:29
поделиться

Если у вас есть выделенный массив символов, вы можете просто поместить '\ 0' где угодно. Затем укажите новый указатель char * на место сразу после вновь вставленного '\ 0' .

Это уничтожит исходную строку, хотя в зависимости от того, где вы поместили '\ 0'

1
ответ дан 27 November 2019 в 03:29
поделиться

Вы можете:

char str[] ="Stackoverflow Serverfault";
char piece1[20] = ""
    ,piece2[20] = "";
char * p;

p = strtok (str," "); // call the strtok with str as 1st arg for the 1st time.
if (p != NULL) // check if we got a token.
{
    strcpy(piece1,p); // save the token.
    p = strtok (NULL, " "); // subsequent call should have NULL as 1st arg.
    if (p != NULL) // check if we got a token.
        strcpy(piece2,p); // save the token.
}
printf("%s :: %s\n",piece1,piece2); // prints Stackoverflow :: Serverfault

Если вы ожидаете более одного токена, лучше позвонить на второй и последующие вызовы на strtok в цикл while, пока возвращаемое значение strtok не станет NULL .

1
ответ дан 27 November 2019 в 03:29
поделиться
char *line = strdup("user name"); // don't do char *line = "user name"; see Note

char *first_part = strtok(line, " "); //first_part points to "user"
char *sec_part = strtok(NULL, " ");   //sec_part points to "name"

Примечание: strtok изменяет строку, поэтому не передавайте ее указатель на строковый литерал.

3
ответ дан 27 November 2019 в 03:29
поделиться

Вы можете использовать strtok () для этого Пример: у меня это работает

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

int main ()
{
    char str[] ="- This, a sample string.";
    char * pch;
    printf ("Splitting string \"%s\" into tokens:\n",str);
    pch = strtok (str," ,.-");
    while (pch != NULL)
    {
        printf ("%s\n",pch);
        pch = strtok (NULL, " ,.-");
    }
    return 0;
}
3
ответ дан 27 November 2019 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: