Я задавался вопросом, как Вы могли взять 1 строку, разделите ее на 2 с разделителем, таким как пространство, и отведите эти 2 роли 2 отдельным строкам. Я попытался использовать strtok()
но напрасно.
#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);
}
Если вы готовы изменить исходную строку, вы можете просто заменить разделитель на \ 0
. Исходный указатель будет указывать на первую строку, а указатель на символ после разделителя укажет на вторую строку. Хорошо, что вы можете использовать оба указателя одновременно, не выделяя никаких новых строковых буферов.
Для подобных целей я обычно использую 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'
Если требуются другие разделители, то выполните цикл.
Надеюсь, это поможет.
Если у вас есть выделенный массив символов, вы можете просто поместить '\ 0'
где угодно.
Затем укажите новый указатель char * на место сразу после вновь вставленного '\ 0'
.
Это уничтожит исходную строку, хотя в зависимости от того, где вы поместили '\ 0'
Вы можете:
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
.
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
изменяет строку, поэтому не передавайте ее указатель на строковый литерал.
Вы можете использовать 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;
}