c++ 字符串标记化代码卡在while循环中

wwodge7n  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(69)

任务是找到数组s中所有包含数字的单词。这些字以" "隔开,并且在阵列的末尾总是有.
我的代码没有退出while循环,我不知道为什么:

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cctype>

using namespace std;
void Numbers(char s[], vector<pair<int, char>>& nums){
    char *token;
    int zero = 0;
    token = strtok(s, " ");
    for(int i = 0; i < strlen(token); i++){
        if(isdigit(token[i])){
            nums.emplace_back(zero, *token);
        }
    }
    while(token != NULL){
        zero ++;
        token = strtok(NULL, " ");
        for(int i = 0; i < strlen(token); i++){
            if(isdigit(token[i])){
                nums.emplace_back(zero, *token);
            }
        }
    }
}
int main() {
    vector<pair<int, char>> nums;
    char s[256];
    gets(s);
    Numbers(s, nums);
    cout << nums.size();
    for (int i = 0; i < nums.size(); i ++){
        cout << nums[i].first << " " << nums[i].second << endl;
    }
    return 0;
}

我试着运行代码与qw6wqe esd9f 0gfgkj.输入与调试,token的变化,所有应该工作,但它从来没有得到的循环。
尝试使用break,但不起作用。

e0bqpujr

e0bqpujr1#

你的程序有未定义的行为。当到达输入的末尾时,token是一个空指针,然后将其传递给strlen
strtok返回空指针时,需要停止处理。

void Numbers(char s[], vector<pair<int, char>>& nums){
    int count = 0;
    for(char * token = strtok(s, " "); token = strtok(nullptr, " ");){
        for(int i = 0; i < strlen(token); i++){
            if(isdigit(token[i])){
                nums.emplace_back(count, *token);
            }
        }
        count++;
    }
}

相关问题