You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++新手求助:使用strtok()后cout无法执行的问题排查

问题分析与解决

嘿,我来帮你排查这个问题!你的代码里最后那句cout<<"Hello"没执行的核心原因是循环里错误地输出了NULL指针,触发了未定义行为导致程序提前终止。

问题出在哪?

看你的循环逻辑:

while(ptr!=NULL){
    ptr=strtok(NULL," ");
    cout<<ptr<<endl;
}

当strtok遍历到最后一个token之后,再次调用strtok(NULL," ")会返回NULL。这时候你把NULL赋值给ptr,紧接着执行cout<<ptr<<endl——而在C++中,尝试输出指向char的NULL指针是未定义行为,大多数情况下程序会直接崩溃或者终止运行,后面的cout<<"Hello"自然没机会执行。

修正后的代码

把输出操作放在获取下一个token之前,先确保ptr不是NULL再输出:

#include<iostream>
#include<cstring>
#include<climits>
#include<string>
#include<algorithm>
using namespace std;
int main() {
    char s[100]="today is a rainy day";
    char *ptr=strtok(s," ");
    while(ptr!=NULL){
        cout<<ptr<<endl;  // 先输出有效指针指向的内容
        ptr=strtok(NULL," ");  // 再获取下一个token
    }
    cout<<"Hello";
    return 0;
}

逻辑解释

  1. 第一次调用strtok(s," ")拿到第一个token "today",此时ptr不为NULL,进入循环
  2. 先输出当前的token,再调用strtok(NULL," ")获取下一个token
  3. 当strtok返回NULL时,循环条件ptr!=NULL不成立,直接退出循环,不会执行输出NULL的操作
  4. 最后cout<<"Hello"就能正常执行了

额外注意事项

  • strtok会修改原始字符串:它会把找到的分隔符替换成\0,所以不能用它处理const char*类型的字符串
  • strtok是线程不安全的:如果在多线程环境下使用,建议用POSIX标准的strtok_r或者Windows平台的strtok_s替代

内容的提问来源于stack exchange,提问作者Akishere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:28:11