2010-03-19 3 views
22

Tôi muốn tạo một chương trình sẽ đọc một số ở định dạng chuỗi và xuất nó như sau: nếu số là 12345 thì nó sẽ xuất ra 12 23 34 45. Tôi đã thử sử dụng hàm substr() từ thư viện chuỗi C++, nhưng nó cho tôi kết quả lạ - nó xuất ra 1 23 345 45 thay vì kết quả mong đợi. Tại sao ?Làm thế nào để sử dụng hàm string.substr()?

#include <iostream> 
#include <string> 
#include <cstdlib> 
using namespace std; 
int main(void) 
{ 
    string a; 
    cin >> a; 
    string b; 
    int c; 

    for(int i=0;i<a.size()-1;++i) 
    { 
     b = a.substr(i,i+1); 
     c = atoi(b.c_str()); 
     cout << c << " "; 
    } 
    cout << endl; 
    return 0; 
} 
+1

['atoi' không nên được sử dụng] (http://stackoverflow.com/q/17710018/995714) –

Trả lời

44

Nếu tôi chính xác, tham số thứ hai là substr() phải là độ dài của chuỗi con. Làm thế nào về

b = a.substr(i,2); 

?

+1

Vâng, anh ấy tăng chiều dài của chuỗi con mỗi lần. –

+1

+1, quan sát tốt! –

16

Như here, đối số thứ hai để substrdài, không phải là vị trí kết thúc:

string substr (size_t pos = 0, size_t n = npos) const;

Tạo chuỗi

Trả về một đối tượng chuỗi với nội dung của nó được khởi tạo thành chuỗi con của đối tượng hiện tại. Chuỗi con này là chuỗi ký tự bắt đầu ở vị trí ký tự pos và có độ dài là n ký tự.

dòng của bạn b = a.substr(i,i+1); sẽ tạo ra, đối với giá trị của i:

substr(0,1) = 1 
substr(1,2) = 23 
substr(2,3) = 345 
substr(3,4) = 45 (since your string stops there). 

gì bạn cần là b = a.substr(i,2);

Bạn cũng nên lưu ý rằng đầu ra của bạn sẽ trông buồn cười cho một số mặt hàng như 12045. Bạn sẽ nhận được 12 20 4 45 do thực tế bạn đang sử dụng atoi() trên phần chuỗi và xuất số nguyên đó. Bạn có thể muốn thử chỉ outputing chuỗi chính nó mà sẽ được hai nhân vật dài:

b = a.substr(i,2); 
cout << b << " "; 

Trong thực tế, toàn bộ điều có thể được đơn giản hơn bằng văn bản như:

#include <iostream> 
#include <string> 
using namespace std; 
int main(void) { 
    string a; 
    cin >> a; 
    for (int i = 0; i < a.size() - 1; i++) 
     cout << a.substr(i,2) << " "; 
    cout << endl; 
    return 0; 
} 
2

Một biến thể câu hỏi thú vị có thể là:

Bạn làm cách nào để tạo "12345" làm "12 23 34 45" mà không sử dụng chuỗi khác?

Sẽ làm gì sau đây?

for(int i=0; i < a.size()-1; ++i) 
    { 
     //b = a.substr(i, 2); 
     c = atoi((a.substr(i, 2)).c_str()); 
     cout << c << " "; 
    } 
2

Bạn có thể nhận được đầu ra trên sử dụng đoạn mã sau trong c

#include<stdio.h> 
#include<conio.h> 
#include<string.h> 
int main() 
{ 
    char *str; 
    clrscr(); 
    printf("\n Enter the string"); 
    gets(str); 
    for(int i=0;i<strlen(str)-1;i++) 
    { 
    for(int j=i;j<=i+1;j++) 
     printf("%c",str[j]); 
    printf("\t"); 
    } 
    getch(); 
    return 0; 
} 
+0

Đó chính xác là những gì bạn không thể làm: http://powerfield-software.com/?p=829 – paxdiablo

2

giải pháp có thể xảy ra mà không sử dụng substr()

#include<iostream> 
#include<string> 

using namespace std; 


int main() { 
    string c="12345"; 
    int p=0; 

    for(int i=0;i<c.length();i++) { 
     cout<<c[i]; 
     p++; 

     if (p % 2 == 0 && i != c.length()-1) { 
      cout<<" "<<c[i]; 
      p++; 
     } 
    } 
} 
2

substr (i, j) có nghĩa là bắt đầu từ chỉ số i (giả sử chỉ số đầu tiên bằng 0 và lấy các ký tự j tiếp theo Nó không có nghĩa là chỉ số tối đa j.