C 文字列の分割(strtok) GDBで観察
"12 34 56"というスペースで区切られた文字列を "12", "34", "56" に分割するプログラム
strtokを繰り返し実行することで、順番に"12", "34", "56"を取得できる。
1回目のstrtokの実行で、
strは"12 34 56"から"12\034 56"に変更される(1番目のスペースが\0に置き換わる)。
そして、strtokは、文字列"12\0"の先頭のポインタを返す。
2回目のstrtokの実行で、
strは"12\034 56"から"12\034\056"に変更される(2番目のスペースが\0に置き換わる)。
そして、strtokは、文字列"34\0"の先頭のポインタを返す。
3回目のstrtokの実行で、
strは変更されない。
そして、strtokは、文字列"56\0"の先頭のポインタを返す。
#include <stdio.h> #include <string.h> int main(void) { char str[] = "12 34 56"; char *tp; tp = strtok(str, " "); puts(tp); while (tp != NULL) { tp = strtok(NULL, " "); if (tp != NULL) puts(tp); } return 0; }
(gdb) break main Breakpoint 1 at 0x114d: file strtok_sample.c, line 5. (gdb) run Breakpoint 1, main () at strtok_sample.c:5 5 char str[] = "12 34 56"; (gdb) next 8 tp = strtok(str, " "); (gdb) x/s str 0x7fffffffdedf: "12 34 56" (gdb) x/9xb str 0x7fffffffdedf: 0x31 0x32 0x20 0x33 0x34 0x20 0x35 0x36 0x7fffffffdee7: 0x00 (gdb) next 9 puts(tp); (gdb) x/s str 0x7fffffffdedf: "12" (gdb) x/9xb str 0x7fffffffdedf: 0x31 0x32 0x00 0x33 0x34 0x20 0x35 0x36 0x7fffffffdee7: 0x00 (gdb) x/s tp 0x7fffffffdedf: "12" (gdb) x/9xb tp 0x7fffffffdedf: 0x31 0x32 0x00 0x33 0x34 0x20 0x35 0x36 0x7fffffffdee7: 0x00 (gdb) next 12 10 while (tp != NULL) { (gdb) next 11 tp = strtok(NULL, " "); (gdb) next 12 if (tp != NULL) puts(tp); (gdb) x/s str 0x7fffffffdedf: "12" (gdb) x/9xb str 0x7fffffffdedf: 0x31 0x32 0x00 0x33 0x34 0x00 0x35 0x36 0x7fffffffdee7: 0x00 (gdb) x/s tp 0x7fffffffdee2: "34" (gdb) x/9xb tp 0x7fffffffdee2: 0x33 0x34 0x00 0x35 0x36 0x00 0xe2 0xde 0x7fffffffdeea: 0xff (gdb) next 34 10 while (tp != NULL) { (gdb) next 11 tp = strtok(NULL, " "); (gdb) next 12 if (tp != NULL) puts(tp); (gdb) x/s str 0x7fffffffdedf: "12" (gdb) x/9xb str 0x7fffffffdedf: 0x31 0x32 0x00 0x33 0x34 0x00 0x35 0x36 0x7fffffffdee7: 0x00 (gdb) x/s tp 0x7fffffffdee5: "56" (gdb) x/9xb tp 0x7fffffffdee5: 0x35 0x36 0x00 0xe5 0xde 0xff 0xff 0xff 0x7fffffffdeed: 0x7f (gdb) next 56 10 while (tp != NULL) { (gdb) next 11 tp = strtok(NULL, " "); (gdb) next 12 if (tp != NULL) puts(tp); (gdb) print tp $1 = 0x0 (gdb) x/9xb str 0x7fffffffdedf: 0x31 0x32 0x00 0x33 0x34 0x00 0x35 0x36 0x7fffffffdee7: 0x00 (gdb) next 10 while (tp != NULL) { (gdb) next 15 return 0;