使用Strtok在C 中进行弦乐操作

String manipulations in C++ using strtok

本文关键字:操作 Strtok 使用      更新时间:2023-10-16

我正在尝试从.gz文件进行一些字符串操作。我已经编写了以下代码。

char buffer[1001];
for(;gzeof(f_Handle);){
    gzread(f_Handle, buffer, 1000);
    buffer[1000] = 0;
    char* chars_array = strtok(buffer, " ");
    while(chars_array){
        cout<<chars_array << 'n';
        chars_array = strtok(NULL, " ");
    }
}

但是,文件格式(.gz)在

A 1 2 3
B 2 3 5
A 4 5 6
B 34 64 123

我想知道何时是A或B,而A或B中的内容分别是A或B中的内容。

目前,它以followng的方式打印出来

A
1
2
3
...

想法a)是使用if loop通过chars_array来找出A或B或

b)字符串数组而不是炭指针

这是一个使用std::string的简单示例,函数substr(...)它不会执行整个字符串,但是您可以将其放在循环中。

#include <string>
#include <iostream>
#include <vector>
int main()
{
    std::string original = "01234567 89abc defghi j";
    std::vector< std::string > strings;
    // Find space from last index
    int lastSpaceIndex = 0;
    int spaceIndex = original.find( ' ', lastSpaceIndex );
    // Find the number of characters to split
    int numCharacters = spaceIndex - lastSpaceIndex;
    // Split string ( the second argument is the number of characters to splut out)
    std::string tokenizedString = original.substr( lastSpaceIndex, numCharacters );
    // Add to vector of strings
    strings.push_back( tokenizedString);
    // Print result
    std::cout << "Space at : " << spaceIndex << std::endl;
    std::cout << "Tokenized string : " << tokenizedString << std::endl;
    // Find the nextsubstring
    // =========================================================================
    // Need to increase by 1 since we don't want the space 
    lastSpaceIndex = spaceIndex + 1;
    spaceIndex = original.find( ' ', lastSpaceIndex );
    numCharacters = spaceIndex - lastSpaceIndex;
    tokenizedString = original.substr( lastSpaceIndex, numCharacters );
     strings.push_back( tokenizedString);
    std::cout << "Space at : " << spaceIndex << std::endl;
    std::cout << "Tokenized string : " << tokenizedString << std::endl;
    std::cout << "=====================================n";
    for ( const auto &str : strings )
    {
        std::cout << "String : " << str << std::endl;
    }
}

输出:

Space at : 8
Tokenized string : 01234567
Space at : 14
Tokenized string : 89abc
=====================================
String : 01234567
String : 89abc

当没有更多空间时,original.find( ' ', lastSpaceIndex )将返回std::npos