2015-04-22 96 views
0

我正在C++中进行作业,但我不允许包含<sstream>
我试图来标记一个char *这样的:当我尝试将char *分隔为令牌时出现分段错误

char *p; 
p = strtok(New_string, " "); 
while (p) { 
    p = strtok(NULL, " "); 
    std::cout << strlen(p); 
} 

我的问题是std::cout << strlen(p);导致赛格故障。 有人可以提供替代strtok()或访问每次strlen(p)的解决方案吗?

+3

为什么在调用'strlen'之前检查'strtok'返回的NULL指针呢?到达字符串末尾时,strtok'返回NULL,据我所知,您应该检查 – mathematician1975

+0

是的,它是空终止的。 – pkenobi23

+0

而'New_string'是.......? –

回答

2

您检查p是不是在你的while条件null,但你的返回值从strtok

while (p) { 
    p = strtok(NULL, " "); 
    std::cout << strlen(p); 
} 

重置它现在还没有保证p不为空下去了。在传递给strlen之前,您应该再次检查它是否为空。到达字符串末尾时,strtok将返回一个空指针(类似地,如果没有找到令牌),所以检查是必要的。

2

strtok将返回NULL当没有更多的令牌被发现。正因为如此,我认为这是你想要什么:

char *p; 
p = strtok(New_string, " "); 
while (p) { 
    std::cout << strlen(p); 
    p = strtok(NULL, " "); 
} 

注意,std::cout <<...strtok被交换。