“tab”输出有问题。我的程序将显示部分金额。 我想在tab数组中保存那些部分和,但它只显示第一个总和。
这是我写的代码:
const char numbers[] = { "1 2 3 4" };
cout << numbers << endl;
for (int i = 0; i < strlen(numbers); ++i)
{
if (numbers[i] != ' ') cout << numbers[i] << endl;
}
int sum = 0;
char tab[20];
for (int i = 0; i < strlen(numbers); ++i){
if (numbers[i] != ' ') {
sum += atoi(&numbers[i]);
_itoa_s(sum,&tab[i],sizeof(tab),10);
}
}
cout << tab;
_getch();
return 0;
我如何能够显示适当的部分总和,如:1 3 6 10
答案 0 :(得分:1)
sizeof以字节为单位显示数组的大小,而不是数组中元素的数量。
这样的东西会给你元素的数量:
int num_element = sizeof(numbers)/sizeof(numbers[0]);
或完整解决方案:
const char numbers[] = { "1 2 3 4" };
int num_elements = sizeof(numbers)/sizeof(numbers[0]);
cout << numbers << endl;
for (int i = 0; i < num_elements; ++i)
{
if (numbers[i] != ' ') cout << numbers[i] << endl;
}
int sum = 0;
char tab[20];
for (int i = 0; i < num_elements; ++i){
if (numbers[i] != ' ') {
sum += atoi(&numbers[i]);
_itoa_s(sum,&tab[i],sizeof(tab),10);
}
}
cout << tab;
_getch();
return 0;
虽然将num_element
替换为for循环后上述内容应该有效,但我建议你调查一下std::array或std::vector
答案 1 :(得分:0)
答案 2 :(得分:0)
首先,cout << tab;
仅打印第一个元素。
其次,不是将结果写入tab[i]
,而是创建int cnt = 0; _itoa_s(sum,&tab[cnt],sizeof(tab),10); cnt++
通过这种方式,您在选项卡数组中不会有空字符。
第三,您可以保留int tab[20]
,而不是留在char tab[]
。
至此,int num_elem = sizeof(numbers)/sizeof(numbers[0]);
(如上所述)。
答案 3 :(得分:0)
您的代码有几个问题。第一个是函数atoi将返回一个错误,因为它将考虑从&amp; numbers [i]开始直到终止零的所有字符串。另一个问题是表达式
_itoa_s(sum,&tab[i],sizeof(tab),10);
使用tab [i]不正确。
请尝试以下代码。
#include <iostream>
#include <cstring>
#include <cctype>
#include <cstdio>
//...
const char numbers[] = { "1 2 3 4" };
char tab[20];
char *p = tab;
int sum = 0;
for ( size_t i = 0, n = std::strlen( numbers ); i < n; i++ )
{
if ( std::isdigit( numbers[i] ) )
{
sum += numbers[i] - '0';
p += std::sprintf( p, "%d ", sum );
}
}
std::cout << tab << std::endl;
至少我得到了输出
1 3 6 10
最好使用std::istringstream
代替提取数字的for循环。