2 Câu hỏi: Tôi hiện đang cố gắng lưu một bộ số nguyên trong một mảng int, bằng cách xác định lại chuỗi thành số, sau đó lưu trữ nó trong mảng
Tôi đang cố gắng chuyển đổi văn bản /số (chuỗi) đầu vào, sẽ bao gồm bất kỳ ký tự nào, nhưng tôi muốn tách các số khỏi các ký tự và lưu trữ chúng thành một mảng số nguyên, khi nó được chuyển đổi từ một chuỗi.
Tôi tin rằng vấn đề là chuỗi chuyển đổi thành số nguyên bằng cách sử dụng stoi()
, nhưng dường như tôi không thể phát hiện ra vấn đề.
Hiện tại, mã chấp nhận bất kỳ đầu vào nào và biến nó thành một chuỗi, sau đó chuỗi được kiểm tra theo từng ký tự và tất cả các số không phân tách bằng dấu phẩy hoặc dấu cách được thêm vào với nhau, một khi dấu phẩy hoặc dấu cách hoặc bất kỳ ký tự nào khác tách số, toàn bộ số được thêm vào mảng và sau đó tiếp tục kiểm tra chuỗi để biết thêm số.
Có ý tưởng nào không? Ví dụ đầu vào1: 12, 13, 15 Ví dụ đầu vào2: 12 13 15 Ví dụ đầu vào3: 12ab13cd15ef
Kết quả trong mảng số nguyên: 0 [12] 1 [13] 2 [15] Những số này sẽ được sử dụng theo thứ tự cụ thể, bằng cách sử dụng các số trong mảng.
#include<iostream>
#include<string>
#include <sstream>
using namespace std;
int main()
{
string datainput, str1, str3;
cin >> datainput;
int n = 0, raycount = 0, c;
int myray[10];
while (datainput[n])
{
if (datainput[n] == ('0') || datainput[n] == ('1') || datainput[n] == ('2') || datainput[n] == ('3') || datainput[n] == ('4') ||
datainput[n] == ('5') || datainput[n] == ('6') || datainput[n] == ('7') || datainput[n] == ('8') || datainput[n] == ('9'))
{
str1 = datainput[n];
str3 += str1;
}
else
{
c= stoi(str3);
c >> myray[raycount];
raycount++;
}
n++;
}
cout << myray[0] << endl;
cout << myray[1] << endl;
cout << myray[2] << endl;
cout << myray[3] << endl;
system("pause");
return 0;
}
Tôi thấy khá nhiều vấn đề với mã của bạn.
-
Trước C ++ 11,
while (datainput[n])
có hành vi không xác định một lầnn
đến cuối chuỗi. -
Cách bạn kiểm tra các chữ số có thể được đơn giản hóa rất nhiều bằng cách sử dụng
std::isdigit()
hoặc thậm chí chỉ là kiểm tra phạm vi đơn giản bằng cách sử dụng toán tử>=
và<=
. -
Bạn không hạch toán chính xác các số được phân tách bằng các ký tự khác hoặc khi số cuối cùng trong chuỗi nằm ở cuối chuỗi.
-
Thay vào đó, câu lệnh
c >> myray[raycount];
cần được thay đổi thànhmyray[raycount] = c;
. Và bạn sẽ không phá vỡ vòng lặp của mình nếuraycount
đạt công suất tối đamyray[]
. -
Bạn không đặt lại
str3
trở lại chuỗi trống sau khi chuyển đổi nó bằngstd::stoi()
. Bạn chỉ cần nối các chữ số mới vào cuối các chữ số trước mà không bị ngắt giữa các số.
Thay vào đó, hãy thử một cái gì đó giống như thế này:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string datainput, str3;
cin >> datainput;
int myray[10];
int raycount = 0;
bool gettingDigits = false;
for (int n = 0; n < datainput.size(); ++n)
{
char ch = datainput[n];
//if (isdigit(ch))
if (ch >= '0' && ch <= '9')
{
if (!gettingDigits)
{
str3 = "";
gettingDigits = true;
}
str3 += ch;
}
else
{
if (gettingDigits)
{
myray[raycount] = stoi(str3);
raycount++;
str3 = "";
gettingDigits = false;
if (raycount == 10) break;
}
}
}
if (gettingDigits && (raycount < 10))
{
myray[raycount] = stoi(str3);
raycount++;
}
for (int n = 0; n < raycount; ++n)
cout << myray[n] << endl;
system("pause");
return 0;
}
Ngoài ra:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string datainput, str3;
cin >> datainput;
int myray[10];
int raycount = 0;
string::size_type start = datainput.find_first_of("0123456789");
string::size_type end;
while (start != string::npos)
{
end = datainput.find_first_not_of("0123456789", start+1);
if (end == string::npos)
{
str3 = datainput.substr(start);
myray[raycount] = stoi(str3);
raycount++;
break;
}
str3 = datainput.substr(start, end-start);
myray[raycount] = stoi(str3);
raycount++;
if (raycount == 10) break;
start = datainput.find_first_of("0123456789", end+1);
}
for (int n = 0; n < raycount; ++n)
cout << myray[n] << endl;
system("pause");
return 0;
}
-
2019-05-08 20: 06: 06Z
-
2019-05-08 20: 09: 37Z
-
2019-05-08 20: 39: 55Z
-
2019-05-08 21: 38: 44Z
Vì vậy, bạn muốn tách các số và ký tự thành các mảng khác nhau. Trong khối nếu bạn đang kiểm tra các ký tự, vì vậy, tôi nghi ngờ stoi () sẽ không hoạt động. Tốt hơn là đánh máy nó thành một số nguyên.
int temp[10];
if (datainput[n] == ('0') || ...) {
temp[n] = int(datainput[n]);
}
wa nàyy mảng tạm thời của bạn sẽ chứa các số.
-
2019-05-13 08: 34: 19Z