簡體   English   中英

如何從字符串中提取整數? C ++

[英]how to extract integer from a string? c++

我從txt文件中提取了這一行(文件的第一行):

#operation=1(create circle and add to picture) name X Y radius.

為什么此代碼不采用整數1並將其放入k?

Circle Circle::CreateCirc(Circle c){
    int k;
    ifstream myfile("cmd.txt");
    if (!myfile.is_open())
        cout<<"Unable to open the requested file "<<endl;
    string line,line2="create circle";
    for (int i=1;i<countrows();i++)
    {
        getline(myfile,line);
        if (line.find(line2)!=string::npos)
        {
             istringstream ss(line);
             ss>>k;
             cout<<k<<endl;

        }

    }
    return c;

}

相反,我正在獲取地址記憶...幫助PLZ

因為該行不是以數字開頭。 在提取數字之前,您需要跳過#operation #operation=部分。

您應該檢查提取結果和getline ,以幫助確定失敗的原因。

另外,如果countrows()返回文件中的預期行數,則循環將錯過最后一行。 從零開始循環,或者當i <= countrows() 或者,如果您要處理文件中的每一行,則可以簡單地循環while (getline(myfile,line))

如果您嘗試讀取的文件中的實際文本以"#operation=1"開頭,並且您希望從中開始使用數字1 ,則不能使用簡單的輸入運算符。 它將首先讀取字符'#' ,因為它不是數字,所以解析將失敗,並且不會初始化k 如果k未初始化,它將是不確定的值,讀取該值將導致不確定的行為和看似隨機的輸出。

您需要檢查提取是否有效:

if (ss >> k)
    std::cout << k << '\n';

但是,這不能解決您的問題,就像我上面說的那樣,您不能在此處使用簡單的輸入運算符。 您需要使用其他方法來解析字符串。 一種方法可能是找到相等的字符'='然后獲取一個子字符串以嘗試提取數字。

編輯:一種方法來做它有點接近您嘗試使用atoi()而不是流來做的方式。

#include <iostream>
#include <cstdlib> // for atoi()
int main(){

    std::string str = "#operation=1(create circle and add to picture) name X Y radius.";
    int k;

    std::string line=str, line2="(create circle";

    std::size_t fnd = line.find(line2);
    if (fnd!=std::string::npos)
    {
         k = atoi(&str[fnd-1]); // int atoi(const char *str) == argument to integer
         std::cout<< k << " " << str[fnd-1] << str[fnd] << " ";
    }
}

有幾種方法可以從字符串中提取整數,但我喜歡從字符串中過濾出數字;

#include <iostream>

int main(){

    std::string str = "#operation=1(create circle and add to picture) name X Y radius.";
    int k = 0;

    // an array of our base10 digits to filter through and compare
    const char digit[] = {'0','1','2','3','4','5','6','7','8','9'};

    for(int s_filter = 0; s_filter<str.size(); ++s_filter){
        for(int d_filter = 0; d_filter<10; ++d_filter){
        // filter through each char in string and
        // also filter through each digit before the next char

            if(digit[d_filter] == str[s_filter]) {
            // if so the char is equal to one of our digits

                k = d_filter;// and d_filter is equal to our digit
                break;

            } else continue;
        }
    }
    switch(k) {
        case 1:
            std::cout<< "k == 1";
            // do stuff for operation 1..
            return 0;
        case 2:
            std::cout<< "k != 1";
            // do more stuff
            break;
        //case 3: ..etc.. etc..
        default:
            std::cout<< "not a digit";
            return 1;
    }
}

嘗試這個:

Circle Circle::CreateCirc(Circle c){
 const std::streamsize ALL = std::numeric_limits< std::streamsize >::max(); // #include <limits> needed
 int k;
 ifstream myfile("cmd.txt");
 if (!myfile.is_open())
    cout<<"Unable to open the requested file "<<endl;
 for (int i=1;i<countrows(); ++i, myfile.ignore(ALL,'\n') ) // skip rest of the line
 {
    if( myfile.ignore(ALL,'=') >> k  )
    {
         cout<<k<<endl;
    }
    else
        break; // read error
 }
 return c;
}
// find_num.cpp (cX) 2015 adolfo.dimare@gmail.com
// http://stackoverflow.com/questions/21115457/

#include <string> // std::string
#include <cctype> // isnum

/// Find the number in 'str' starting at position 'pos'.
/// Returns the position of the first digit of the number.
/// Returns std::string::npos when no further numbers appear within 'str'.
/// Returns std::string::npos when 'pos >= str.length()'.
size_t find_num( const std::string str, size_t pos ) {
    size_t len = str.length();
    bool   isNegative = false;
    while ( pos < len ) {
        if ( isdigit(str[pos]) ) {
            return ( isNegative ? pos-1 : pos );
        }
        else if ( str[pos]=='-' ) {
            isNegative = true;
        }
        else {
            isNegative = false;
        }
        ++pos;
    }
    return std::string::npos;
}

#include <cassert>     // assert()
#include <cstring>     // strlen();

int main() {
    std::string str;

    str = "";
    assert( std::string::npos == find_num( str, 0 ) );
    assert( std::string::npos == find_num( str, 9 ) );

    str = "#operation=1(create circle and add to picture) name X Y radius.";
    assert( strlen("#operation=") == find_num( str, 0 ) );

    str = "abcd 111 xyx 12.33 alpha 345.12e-23";
    ///    0123456789.123456789.123456789.123456789.
    assert(     5 == find_num( str, 0 ) );
    assert(            13 == find_num( str, 5+3 ) );
    assert(                        25 == find_num( str, 20 ) );

    str = "abcd-111 xyx-12.33 alpha-345.12e-23";
    ///    0123456789.123456789.123456789.123456789.
    assert(    4 == find_num( str, 0 ) );
    assert(           12 == find_num( str, 5+3 ) );
    assert(                       24 == find_num( str, 20 ) );

    str = "-1";
    assert( 0 == find_num( str, 0 ) );
    assert( 1 == find_num( str, 1 ) );
    assert( std::string::npos == find_num( str, 2 ) );
    assert( std::string::npos == find_num( str, strlen("-1") ) );

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM