这应该非常简单,但我已经习惯了更高级别的语言并且缺少某些东西。我只是想确保输入的数字是五个数字,然后找到最高的数字。不幸的是,第二部分出了问题。
#include <iostream>
#include <string>
bool isFiveDigits(int num) {
if (std::to_string(num).length() == 5) {
return true;
} else {
return false;
}
}
int highestInArr(int *nums) {
int highest = nums[0];
for (int i = 1; i < sizeof(nums); i++) {
int temp = nums[i];
if (temp > highest) {
highest = temp;
}
}
return highest;
}
int main() {
using namespace std;
int num;
int nums [5];
cout << "Enter a five digit number!\n";
cin >> num;
if (!isFiveDigits(num)) {
cout << "Not five digits, can you even count?";
return 1;
}
string numstr = to_string(num);
for (int i = 0; i < numstr.length(); i++) {
cout << numstr[i] << " ";
nums[i] = (int)numstr[i];
}
cout << "\n" << highestInArr(nums);
}
当这个运行时,我得到:
Enter a five digit number!
12345
1 2 3 4 5
1424080487
当然,1,424,080,487
不在[1, 2, 3, 4, 5]
。
答案 0 :(得分:2)
您不能将指针传递给函数并在不扣除模板的情况下获取其大小。在运行时,所有接收的函数都是指针。当您调用sizeof(nums)
时,您没有获得原始数组的大小。您只需获取指针的大小,这与说sizeof(int_ptr)
相同。相反,在使用大小为动态的集合时,您应该使用std::vector
。
现在,您可以通过执行以下操作来获得大小:
#include <iostream>
template<typename num_t, size_t N>
num_t max_num(num_t(&arr)[N]) {
num_t m = (num_t)0;
for (size_t i = 0; i < N; ++i)
if (arr[i] > m)
m = arr[i];
return m;
}
int main(){
int foo[] = { 1, 5, 2, 4, 3 };
int m = max_num(foo);
std::cout << m << std::endl;
std::cin.get();
return 0;
}
但是,这不一定是首选,并假设阵列是在调用者的堆栈上创建的。它不适用于使用new[]
创建的动态分配的数组。如果您使用不同的大小多次执行此操作,您将拥有相同功能的多个实现(这是模板的功能)。使用std::array<int, N>
也是如此。如果您使用N
作为size_t
模板参数,它将执行相同的操作。
有两个首选方案:
std::vector
,以便被调用者负责大小。示例:
#include <vector>
#include <iostream>
#include <algorithm>
int main(){
std::vector<int> vec{ 1, 5, 2, 4, 3 };
int m = *std::max_element(std::cbegin(vec), std::cend(vec));
std::cout << m << std::endl;
std::cin.get();
return 0;
}
至于is_5_digits,你应该使用base-10对数函数。
#include <cmath>
// ...
int i = 12345;
size_t length = (i > 0 ? (int)log10(i) : 0) + 1;
std::cout << length << std::endl; // prints 5;
答案 1 :(得分:0)
首先,您不能简单地将char
转换为int
,就像(int)numstr[i]
一样,假设它会返回它所包含的数字。
请参阅,如果您有一个字符'0'
,则表示存储了等效的ASCII,如果48
则为0
,49
为'1'
1}}等等。
因此,为了获得该数字(0,1,2,...,9
),您需要从ASCII值中减去48
。
所以改变这一行:
nums[i] = (int)numstr[i];
为:
nums[i] = (int)numstr[i] - 48; // or nums[i] = (int)numstr[i] - '0';
另外,在你的highestInArr
函数中,你得到一个指针作为参数,在函数中,你使用sizeof
来确定数组的大小。您不能简单地这样做,sizeof
将返回int*
的大小,这不是数组的大小,因此您必须将size
作为第二个参数传递给该函数,并在循环中使用它。
像这样:
int highestInArr(int *nums, int size) {
// ...
for (int i = 1; i < size; i++) {
// ...
}
// ...
}