我在解决我的一项家庭作业问题时遇到困难。
“编写一个程序,要求用户输入一系列的单数位数字,没有任何分隔。将输入读取为c字符串或字符串对象。该程序应在输入法中显示所有的单数位数字。例如,如果用户输入2514,则程序应显示12,即(2 + 5 + 1 + 4)。程序还应显示字符串中的最高位数和最低位数。“
我遇到的问题是弄清楚如何将字符串中的整数相加。我的代码在下面,感谢您的任何帮助,谢谢!
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
//Declaring Variables & Character Array:
int size;
int sum;
char integers[size];
//Gathering Integers:
cout << "Please enter a series of integers with nothing between them.";
cin >> integers;
//Gathering Size of String:
size = strlen(integers) + 1;
//Adding up Contents Within String:
for(int i = 0; i < size; i++)
{
if(integers[i] > 0 && integers[i] < 9 && integers != "\0")
{
sum = integers[i]++;
}
}
//Outputting Sum:
cout << sum;
return 0;
}
答案 0 :(得分:2)
因此,您的方法存在一些问题,请考虑以下提示:
cin
读入std::string
。'0'
转换为0
(提示,ascii字符也具有数字值,也许对此进行调查。)sum = integers[i]++;
并不是您求和编号的方法。答案 1 :(得分:1)
您可以使用以下内容:
std::string integers;
//Gathering Integers:
cout << "Please enter a series of integers with nothing between them.";
cin >> integers;
int sum = 0;
for (char c : integers)
if (c >= '0' && c <= '9')
sum += c - '0';
为解释以上代码的作用,我相信前两行很明显,我将跳至for()
循环。这是C ++中使用的foreach
循环形式。它从字符串中逐字符抓取并将其存储在变量中(在本例中为c
),在循环中,我们可以正常检查c
是否为数字0到9的ASCII表示形式。表示形式将转换为integer
(c - '0'
)。
您的方法是将整数与ASCII字符进行比较,您可以尝试以下操作:
if(integers[i] >= '0' && integers[i] =< '9' && integers != '\0') {
sum = integers[i] - `0`;
}
您还有一个问题:
integers != "\0"
应为:
integers[i] != '\0'
“”是字符串的表示形式,即使您有""
,它也是一个空字符串,但其中包含\0
。在上述情况下,“ \ 0”包含“ \ 0 \ 0”。因此,基本上,您想要的是将单个字符与\0
进行比较,而将字符串与\0\0
进行比较。
还有另一个错误:
int size;
...
char integers[size];
...
cin >> integers; // SEGFAULT HERE
size = strlen(integers);
未初始化的变量在C ++中是未定义的行为,并且可能包含从0
到MAX_INT
的垃圾。如果segfault
是size
,则可能会得到0
,而您稍后尝试在0
中输入超过integers
个字符。您甚至会在到达size = strlen()
之前进行段错误。
另一个未初始化的变量:
int size;
在修复了上述所有错误之后,我实际上从您的程序中获得了432552作为输出。
这是您的调试代码:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
//Declaring Variables & Character Array:
int size = 100; // UNINITIALIZED VARIABLE
int sum = 0; // UNINITIALIZED VARIABLE
char integers[size];
//Gathering Integers:
cout << "Please enter a series of integers with nothing between them.";
cin >> integers;
//Gathering Size of String:
size = strlen(integers); // +1 ??? why
//Adding up Contents Within String:
for(int i = 0; i < size; i++)
{
// integers[i] >= 0 is comparing char to int
// integers[i] <= 9 is comparing char to int
// ingegers == "\0" is comparing entire string with stirng which contains "\0":s
// < and > shoudl be <= nad >= to include 0 and 9
if(integers[i] >= '0' && integers[i] <= '9' && integers[i] != '\0')
{
// sum = integers[i]++; is incrementing character at integer[i]` not `sum`
sum += integers[i] - '0';
}
}
//Outputting Sum:
cout << sum;
return 0;
}
哈哈刚刚意识到您遇到的另一个错误:strlen()
返回整数长度,假设string s="ABCD"
被赋予strlen(s)
将返回4,然后在for()
循环中循环从0,最多4个,但自s[0] = 'A'
,s[1] = 'B'
,s[2] = 'c'
和s[3] = 'D'
起不包含4。
如果您看到所有字符都有十进制值:这是上面的ascii表中的字符0 - 9
的简短表:
Character | Decimal Value
----------+--------------
0 | 48
1 | 49
2 | 50
3 | 51
4 | 52
5 | 53
6 | 54
7 | 55
8 | 56
9 | 57
所以要这样做:
integers[i] - '0'
基本上就像是说
integers[i] - 48
如果integer[i]
是8
,它将保留56
的十进制值。因此56 - 48
将给出8
答案 2 :(得分:1)
利用上面你们的帮助,我对其进行了编辑,以便现在可以这样工作:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
//Declaring Variables & Character Array:
int size;
char integers[size];
int sum;
//Small and Large Numbers:
int small = 9;
int large = 0;
//Gathering Integers:
cout << "Please enter a series of integers with nothing between them.";
cin >> integers;
//Gathering Size of String:
size = strlen(integers) + 1;
for(int i = 0; i < size; i++)
{
if(integers[i] >= '0' && integers[i] <= '9' && integers[i] != '\0')
{
if(integers[i] == '0')
sum += 0;
if(integers[i] == '1')
sum += 1;
if(integers[i] == '2')
sum += 2;
if(integers[i] == '3')
sum += 3;
if(integers[i] == '4')
sum += 4;
if(integers[i] == '5')
sum += 5;
if(integers[i] == '6')
sum += 6;
if(integers[i] == '7')
sum += 7;
if(integers[i] == '8')
sum += 8;
if(integers[i] == '9')
sum += 9;
}
}
cout << sum << endl;
return 0;
}