strtok program crashing
在 http://www.opengroup.org/onlinepubs/000095399/functions/strtok.html 上给出的 strtok 程序
每次都崩溃..
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <string.h>
...
char *token ;
char *line ="LINE TO BE SEPARATED";
char *search ="";
/* Token will point to"LINE". */
token = strtok(line , search );
/* Token will point to"TO". */
token = strtok(NULL , search ); |
如果我对变量"行"使用 char 数组,它可以工作。
即 char line[] ="LINE TO BE SEPARATED" 有效。
请解释一下。
- 为什么这有一个 C++ 标签?它是纯 C 代码。 <string.h> 和 ::strtok() 甚至不存在于 C 中。 (它是 <cstring> 和 std::strtok()。)如果您想在 C 中执行此操作,请使用 std::string 和流(或任何提供标记化的库)。
strtok 修改输入字符串 line。
1
| char *line ="LINE TO BE SEPARATED"; |
在这种情况下,line 指向只读内存。因此,无法修改。您需要为 strtok.
传递字符数组
- 为什么 C 不强制 const char* 进行这种类型的初始化?另请注意 char line[] ="LINE TO BE SEPARATED"; 工作正常。
-
@NateS char line[] 是一个可修改的数组,最初只是初始化为包含字符串,这就是它起作用的原因。
n
n
-
我在这里闻到了 std::copy 的味道…… ;-)
-
添加 #include <iostream> 并将 '\
' 替换为 << std::endl
-
@Konrad:我可以猜到你在暗示什么,但是这个 std::copy 习语从来没有真正吸引过我。
-
@James:我添加了 <iostream>,但我看不出有理由为每个令牌刷新 std::cout 的缓冲区,所以我把它留在了 '\
'。
-
@sbi:嗯?一个语句代替了一个有四个语句的循环。诚然,它更长,但 C 在语法上的烂已经不是新闻了。让我看看我是否正确:copy(istream_iterator<string>(iss), istream_iterator<string>(), ostream_iterator<string>(cout,"\
"));。
-
@Konrad:我没有声称我不喜欢理性。 :)
aJ 说需要什么。我的建议是避免丑陋