如何将string拆分为C中的2个string
我想知道如何取1个string,用分隔符(比如空格)将其拆分为2,然后将2个部分分配给2个单独的string。 我试过使用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); }
对于这样的目的,我倾向于使用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'
如果需要更多分隔符,则循环。
希望这可以帮助。
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
修改string,所以不要把它指向string文字的指针。
你可以使用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; }
如果您打算更改原始string,则可以简单地用\0
replace分隔符。 原始指针将指向第一个string,而指向分隔符后指向该字符的指针将指向第二个string。 好处是你可以同时使用两个指针而不用分配任何新的string缓冲区。
如果你有一个字符数组分配,你可以简单地把'\0'
无论你想要的。 然后将一个新的char *指针指向刚插入的'\0'
之后的位置。
这将破坏你的原始string,虽然取决于你把'\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
如果你期待多于一个的令牌,那么最好在while循环中调用第二个和后续的对strtok
调用,直到strtok
的返回值变为NULL
。
这就是你如何实现一个类似strtok()
函数(从BSD许可的string处理库中取得,称为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," "));