Вы можете использовать что-то вроде этого:
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()
. Это форма цикла foreach
, используемого в C ++. Он захватывает символ за строкой из строки и сохраняет его в переменной (в данном случае в c
), и внутри цикла мы обычно проверяем, является ли c
представлением ASCII числа от 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, но не включая 4 с s[0] = 'A'
, s[1] = 'B'
, s[2] = 'c'
и s[3] = 'D'
.
Хорошо, для дальнейшего объяснения, символы также имеют цифровые значения:
Если вы видите, что все символы имеют десятичные значения: вот краткая таблица символов 0 - 9
из таблицы ascii выше:
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