【发布时间】:2018-01-18 06:48:03
【问题描述】:
我正在尝试打印一个大字符串中包含的所有子字符串,每个子字符串由'/' 字符分隔。我的功能没有按预期工作,但我不明白它有什么问题。这是我写的函数:
void print_serial_list(char *serial_list) {
char *iter = serial_list;
while (*iter != '\0') { // Traverse the whole string
char *tmp_fn;
tmp_fn = strtok(iter,"/");
printf("Extracted entry: '%s'\n", tmp_fn);
iter = iter + sizeof(tmp_fn);
}
}
直接传递字符串
如果我像这样运行这个函数:
char *string = "Lorem.ipsum/dolor-sit-amet/consectetur/adipiscing.elit/";
printf("%s\n", string);
print_serial_list(string);
我遇到了分段错误:
Lorem.ipsum/dolor-sit-amet/consectetur/adipiscing.elit/
Segmentation fault (core dumped)
使用get_string() 函数
另一方面,如果我运行这个:
char *string = get_string();
printf("%s\n", string);
print_serial_list(string);
我得到以下输出(仍然错误):
Lorem.ipsum/dolor-sit-amet/consectetur/adipiscing.elit/
Extracted entry: 'Lorem.ipsum'
Extracted entry: 'sum'
Extracted entry: 'r-sit-amet'
Extracted entry: 'et'
Extracted entry: 'ctetur'
Extracted entry: 'dipiscing.elit'
Extracted entry: 'g.elit'
Extracted entry: '�'
Extracted entry: 'x[�V'
Extracted entry: 'x[�V'
期望
为了清楚起见,我希望输出在这两种情况下都是:
Lorem.ipsum/dolor-sit-amet/consectetur/adipiscing.elit/
Extracted entry: 'Lorem.ipsum'
Extracted entry: 'dolor-sit-amet'
Extracted entry: 'consectetur'
Extracted entry: 'adipiscing.elit'
(注意:我希望get_string() 的代码对于理解这个问题不是必需的......我想尽量不要保留这个帖子长)
编辑
根据 cmets 中的一些建议,我以这种方式编辑了函数:
char *iter = serial_list;
bool first = true;
while (*iter != '\0') { // Traverse the whole string
char *tmp_fn;
if (first)
tmp_fn = strtok(iter, "/");
else
tmp_fn = strtok(NULL, "/");
size_t tmp_size = strlen(tmp_fn);
printf("Extracted entry: '%s' - size = %zu\n", tmp_fn, tmp_size);
iter = iter + tmp_size;
first = false;
}
我得到的输出仍然有一些问题,但与我想要的更相似!
Lorem.ipsum/dolor-sit-amet/consectetur/adipiscing.elit/
Extracted entry: 'Lorem.ipsum' - size = 11
【问题讨论】:
-
检查
sizeof(tmp_fn)..打印它。 -
指针上的
sizeof为您提供指针本身的大小,而不是指针所指向的大小。如果要获取字符串的长度,请使用strlen。 -
@Someprogrammerdude 谢谢!你对
strlen的事情是完全正确的。我更改了它,结果只得到了第一个条目:Extracted entry: 'Lorem.ipsum' - size = 11... -
已解决:我根本不需要增加指向 char 的指针,因为
strtok我已经处理好了(所以我刚刚删除了iter = iter + tmp_size;)
标签: c string segmentation-fault strtok