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; }
逻辑解释
- 第一次调用
strtok(s," ")拿到第一个token"today",此时ptr不为NULL,进入循环 - 先输出当前的token,再调用
strtok(NULL," ")获取下一个token - 当
strtok返回NULL时,循环条件ptr!=NULL不成立,直接退出循环,不会执行输出NULL的操作 - 最后
cout<<"Hello"就能正常执行了
额外注意事项
strtok会修改原始字符串:它会把找到的分隔符替换成\0,所以不能用它处理const char*类型的字符串strtok是线程不安全的:如果在多线程环境下使用,建议用POSIX标准的strtok_r或者Windows平台的strtok_s替代
内容的提问来源于stack exchange,提问作者Akishere
相关产品推荐
相关产品推荐

