30/09/2018, 23:44
Lỗi khi viết hàm tính Phép cộng bằng chuỗi
Mình đang viết 1 hàm có chức năng cộng 2 số bằng Chuỗi nhưng bị gặp lỗi !
Source code: http://codepad.org/zaopvj5F
void ChuanHoaChuoi(std::string s1, std::string s2)
{
int len1 = s1.length();
int len2 = s2.length();
int Min = len1 < len2 ? len1 : len2, Max = len1 > len2 ? len1 : len2, space = Max - Min;
if (Min == len1)
{
for (int i = 0; i < space; i++)
{
s1.insert(s1.begin(), '0');
}
}
else if (Min == len2)
{
for (int i = 0; i < space; i++)
{
s2.insert(s2.begin(), '0');
}
}
}
std::string Tong(std::string s1, std::string s2)
{
int r = 0, idx = 0;
std::string a;
ChuanHoaChuoi(s1, s2);
int len = s1.length();
for (int i = len - 1; i >= 0; i--)
{
int digit = (s1[i] - 48) + (s2[i] - 48) + r;
r = digit / 10;
digit %= 10;
a[idx++] = digit + 48;
}
if (r != 0)
a[idx++] = r + 48;
// a[idx] = ' ';
strrev((char *)a.c_str());
return a;
}
int main()
{
std::string s1, s2;
std::cout << "
Nhap so thu 1: ";
std::cin >> s1;
std::cout << "
Nhap so thu 2: ";
std::cin >> s2;
std::string s3;
s3 = Tong(s1, s2);
std::cout << "
Ket qua tong = " << s3 << std::endl;
system("pause");
return 0;
}
Nhưng khi compile & run thì bị lỗi như sau:
Mọi người giúp mình nhé, xin cảm ơn rất nhiều
Bài liên quan
chú debug xem bị lỗi khoảng nào. nhìn code thấy debug khoảng 5 lần là ra :v
thử call watch lên debug xem
Visual nó có bộ debug mạnh thế mà không dùng, bác Bill biết là buồn lắm đấy
string a; chưa có kích thước nên không truy cập a[idx++] được. Có thể dùng a.push_back(…) thay thế
2 anh @nxphuc và @nguyenhuuca cho em hỏi lỗi ở đâu thế ? Em debug rồi nhưng tới chỗ
s3 = TinhTong(s1, s2)
thì bấm F11 nó không cho nhảy vào hàmTinhTong
@Gio Anh có thể nói rõ hơn xíu được không ạ ? Vậy có cách nào làm cho string a “có kích thước” không ? Chứ em chưa biết cái vụ a.push_back(…)
Các cao thủ @nxphuc @Gio @nguyenhuuca rộng lòng giúp em với suy nghĩ cả tối nay mà chưa ra, visual nó không cho nhảy vào hàm Tổng
Bạn thay a[idx++] = xyz = a.push_back(xyz) như gió nói là ra.
Bạn thử tự trả lời 2 câu hỏi này được không nhé cũng là giúp bạn luyện tư duy luôn
1 - Ở hàm Tong, string a, vậy lúc này a đang chứa nội dung gì, và size của nó là bao nhiêu :3 liệu rằng a có phần tử thứ id để gán a[id] = bla bla không :-?
2 - Ở hàm ChuanHoa, 2 string s1 s2 đang được truyền theo hình thức nào? liệu rằng tụi nó và 2 string s1, s2 ở hàm Tong có liên quan gì với nhau hay không?
Đang được truyền theo phương thức bình thường. Em thử sửa lại cho nó là tham chiếu :
std::string ChuanHoaChuoi(std::string &s1, std::string &s2)
nhưng nó vẫn lỗi anhEm không hiểu cho lắm. Thường thì em học chuỗi bên C khi khai báo
char string[MAX]
là nó cho truy cập thoải mái nhưng bên C++ không hiểu sao khi khai báostd::string string
rồistring[idx++]
nó không cho như anh nói !Và em cũng chưa biết cách nào để khắc phục cái lỗi này nữa anh
với std::string thì gọi
+=
thay chopush_back
, ngắn gọn hơna += digit + '0';
muốn đảo chuỗi thì đừng nên gọi strrev của C, vì
c_str()
trả vềconst char*
tức là chỉ để đọc. Để đảo chuỗi hay đảo bất kì container nào thì xàistd::reverse
trong<algorithm>
ấy:std::reverse(begin(a), end(a));
Cho em hỏi 2 tham số trong std::reverse đi anh
Mà anh @tntxtnt có biết lỗi đoạn code trên không giúp em với chứ em rối về chuỗi bên C++ quá
2 tham số trong reverse và rất nhiều hàm khác trong
<algorithm>
là con trỏ hoặc iterator, chỉ cho biết là đảo từ vị trí nào tới vị trí nào tronga
.begin(a)
là lấy iterator tới phần tử đầu tiên tronga
.end(a)
tới iterator tới phần từ phía sau phần tử sau cùng. Cho theo đúng kiểu ví dụ i chạy từ 0 tới n-1 thì mình ghi là i = 0 tới i < n chứ ko ghi n-1 ở đây.ở đây
a
là container bất kì, có thể làstring
,vector
,list
, haydeque
. Xài iterator sướng chỗ đó, ko cần biết container là loại gì (mảng khác xa với dslk). Với mảng thì em có thể xài con trỏa
tớia+n
, hoặc gọistd::begin(a)
tớistd::end(a)
, phải thêmstd::
vô trước nữa, hơi phiền.begin(a)
tớiend(a)
tức là đảoa
từ đầu tới cuối.nếu chỉ đảo 3 ký tự đầu thì em viết là
begin(a)
tớibegin(a)+3
nếu chỉ đảo 3 ký tự thứ 2,3,4 (bắt đầu từ 0) thì em viết là
begin(a)+2
tớibegin(a)+5
v.v…
Vậy anh có thấy lỗi trong đoạn code trên không ạ ?
Chứ hơn 1 ngày rồi mà chả ai nói giúp em @@
có chắc là sau khi trả lời và sửa xong 2 câu hỏi của mình thì nó vẫn không chạy được?
Em chưa hiểu câu thứ 1 của anh ! Vì em học là khai báo std::string a; xong rồi dùng thôi ạ ?
Còn câu thứ 2 thì em nghĩ truyền thêm tham chiếu nhưng chưa được ạ
lúc vừa khai báo string a
thì lúc này trong a có gì?
Em nghĩ là a đang rỗng ạ !
nó rỗng
vậy length của nó bằng bao nhiêu?
Em nghĩ là 0 hoặc chưa có ?
Em chưa chắc về điều này !
nếu nó bằng 0 hay chưa có
vậy a[id++] tức a[0] có tồn tại hay không?
Dạ không ạ