为什么我的代码无法将字符串正确转换为 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 ++的一些现成功能。
scanf
、sscanf
、fscanf
函数有一个格式化程序%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;
}
相关文章:
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 将 int 数组转换为 std::vector<int*>
- 如何转换 int 变量并附加到常量 wchar_t*
- 类型转换<int>的舍入问题
- 在Objective-C中调用sqlite3数据库时,如何调用和转换int/NSNumber
- 转换 int -> 无符号长 长 是否由标准定义
- 简单的 int 到字符串转换..int to const char* 无效
- 如何将转换 int 除法键入为浮点数
- C++类型转换 int * 到类
- 预期的类型说明符,并且无法在初始化时转换“int*”
- 转换int并将其与char*连接
- 字符串流在转换int型时添加新行
- 转换int为字符串/char c++ /Arduino
- c# P-Invoke:如何转换INT fun(BYTE *bStream, UINT16 *nCount, const
- 类型转换(int**)和int(*)的区别
- 从"int"到"nodeType"的无效转换<int>
- 从无符号int构造对强制转换int的引用