簡體   English   中英

為什么我的代碼無法將字符串正確轉換為int數組?

[英]Why can't my code convert the string to int array correctly?

我編寫了一個函數,該函數將由“,”分隔的數字字符串轉換為整數數組並進行打印,因此該字符串為:

string str = "1,-20,-50,-70,6";

變成:

int a[5] = {1,-20,-50,-70,6};

一切似乎都很好,但是對於沒有正確打印的最后一個數字,對於上面的示例,新數組為:1,-50,-20,-70,1999882784

這是我現在所擁有的:

void convert_str_to_int(string str){
    size_t stringLen = str.length(); //find string length
    int arr[stringLen]; //new array to save int values
    string holder = ""; //temporary variable
    int counter = 0;
    for (size_t i = 0;i<stringLen;i++) { 
        if (str[i] != ',')    
            holder = holder+str[i];
        else {
            arr[counter] = atoi(holder.c_str());
            holder = "";
            counter++;
        }
    }
    for (int i = 0;i<=counter;i++){
           cout<<arr[i]<<endl; //to print the array
    }
}

可能是什么問題?

好吧,我將為您提供完整的解決方案,但是我正在使用sstream庫。 請在http://www.cplusplus.com/reference/sstream/istringstream/上閱讀有關此內容的信息

std::vector<int> from_string_to_int_vector(const std::string& arr) {
   std::vector<int> numbers;
   std::string token;
   std::istringstream tokenStream(arr);
   while (std::getline(tokenStream, token, ',')) {
      numbers.push_back(atoi(token.c_str()));
   }
   return numbers;
}

這是因為在arr位置counter中沒有任何元素,即arr[counter]垃圾值

仔細地看,

//Suppose now counter = 4
arr[counter] = atoi(holder.c_str()); // so this is arr[4]
holder = ""; 
counter++; // now counter is 5

顯然,索引5將不在數組大小的范圍內。

所以,當你這樣做

// i will have values from 0 to 5 because of i <= counter
for (int i = 0;i<=counter;i++) { 
    cout<<arr[i]<<endl; // when i == counter , it will print garbage value
}

您可能要刪除=符號,然后執行此操作

for (int i = 0;i<counter;i++) { 
    cout<<arr[i]<<endl;
}

但你的代碼將會給一個元素少於期望是什么,因為沒有,在數組的結尾。 因此,循環結束后,您需要執行

arr[counter] = atoi(holder.c_str());
counter++;

另外,計算字符串的長度並聲明該長度的數組是錯誤的。 而是這樣做:

int *arr = new int[stringLen];
// if you do this, don't forget to free up the memory by using the following line whenever you no longer require arr
delete arr;

或者只是使用向量

vector<int> arr(stringLen);

下面是完整的代碼

void convert_str_to_int(string str){ 
    size_t stringLen = str.length(); 
    vector<int> arr(stringLen);
    string holder = ""; 
    int counter = 0; 
    for (size_t i = 0; i<stringLen; i++) { 
        if (str[i] != ',') {
            holder = holder+str[i]; 
        } else { 
             arr[counter] = atoi(holder.c_str()); 
             holder = ""; 
             counter++; 
        } 
    } 
    arr[counter] = atoi(holder.c_str()); 
    counter++; 
    for (int i = 0;i<=counter;i++){ 
          cout<<arr[i]<<endl; 
    }
}

對於您的問題, for(int i = 0; **i < counter;** ++i)

我建議使用一些現成的c / c ++功能。

scanfsscanffscanf函數具有格式器%n ,該格式器返回當前位置。 用它。

#include <cstdio>
#include <vector>
#include <string>
int main()
{
    std::string str = "1,-20,-50,-70,6";
    std::vector<int> ints;

    const char* c_str = str.c_str();
    int pos = 0, val;

    // sscanf return number of success read variables, except %n.
    while (sscanf(c_str, "%d,%n", &val, &pos) == 1 ) 
    {
        ints.push_back(val);
        c_str += pos;
    }

    // print result array
    for (int i = 0; i < (int)ints.size(); ++i)
         printf("%d ", ints[i]);
    printf("\n");

    return 0;
}

暫無
暫無

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

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