Мне было интересно, как вы можете взять 1 строку, разделите ее на 2 с разделителем, например, на пробел, и назначьте 2 части двум отдельным строкам. Я пробовал использовать strtok()
, но безрезультатно.
Как разбить строку на 2 строки в C
Ответ 1
#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);
Update
Обратите внимание, что в некоторых операционных системах, strtok
man-страница упоминает:
Этот интерфейс устаревает 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);
}
Ответ 2
Для таких целей я предпочитаю использовать 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'
Если требуется больше разделителей, тогда цикл.
Надеюсь, что это поможет.
Ответ 3
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
изменяет строку, поэтому не передавайте ей указатель на строковый литерал.
Ответ 4
Вы можете использовать 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;
}
Ответ 5
Если вы открыты для изменения исходной строки, вы можете просто заменить разделитель на \0
. Исходный указатель укажет на первую строку и указатель на символ после того, как разделитель укажет на вторую строку. Хорошо, что вы можете использовать оба указателя одновременно, не выделяя никаких новых буферов строк.
Ответ 6
Если у вас есть выделенный массив char, вы можете просто поместить '\0'
туда, где хотите.
Затем укажите новый указатель char * на место сразу после недавно вставленного '\0'
.
Это разрушит исходную строку, но в зависимости от того, где вы положили '\0'
Ответ 7
Вы можете сделать:
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
.
Ответ 8
Вот как вы реализуете функцию strtok()
как (взятую из BSD лицензированную библиотеку обработки строк для C, называемую zString).
Ниже функция отличается от стандартного strtok()
тем, как распознает последовательные разделители, тогда как стандартный strtok()
не работает.
char *zstring_strtok(char *str, const char *delim) {
static char *static_str=0; /* var to store last address */
int index=0, strlength=0; /* integers for indexes */
int found = 0; /* check if delim is found */
/* delimiter cannot be NULL
* if no more char left, return NULL as well
*/
if (delim==0 || (str == 0 && static_str == 0))
return 0;
if (str == 0)
str = static_str;
/* get length of string */
while(str[strlength])
strlength++;
/* find the first occurance of delim */
for (index=0;index<strlength;index++)
if (str[index]==delim[0]) {
found=1;
break;
}
/* if delim is not contained in str, return str */
if (!found) {
static_str = 0;
return str;
}
/* check for consecutive delimiters
*if first char is delim, return delim
*/
if (str[0]==delim[0]) {
static_str = (str + 1);
return (char *)delim;
}
/* terminate the string
* this assignmetn requires char[], so str has to
* be char[] rather than *char
*/
str[index] = '\0';
/* save the rest of the string */
if ((str + index + 1)!=0)
static_str = (str + index + 1);
else
static_str = 0;
return str;
}
Ниже приведен пример кода, демонстрирующего использование
Example Usage
char str[] = "A,B,,,C";
printf("1 %s\n",zstring_strtok(s,","));
printf("2 %s\n",zstring_strtok(NULL,","));
printf("3 %s\n",zstring_strtok(NULL,","));
printf("4 %s\n",zstring_strtok(NULL,","));
printf("5 %s\n",zstring_strtok(NULL,","));
printf("6 %s\n",zstring_strtok(NULL,","));
Example Output
1 A
2 B
3 ,
4 ,
5 C
6 (null)
Вы даже можете использовать цикл while (стандартная библиотека strtok()
даст тот же результат)
char s[]="some text here;
do {
printf("%s\n",zstring_strtok(s," "));
} while(zstring_strtok(NULL," "));