2015-07-21 144 views
3
#include<iostream> 
using namespace std; 
int main() 
{ 
    char s1[80]={"This is a developed country."}; 
    char *s2[8]; 
    s2[0]=&s1[10]; 
    cout<<*s2; //Predicted OUTPUT: developed 
        // Actual OUTPUT: developed country. 
    return 0; 
} 

我想要那個cout < < * s2;應該只打印其中的字母{「developed」},所以我給了* s2 [8]長度爲8個字符。我該怎麼做,以便變量cout < < * s2將只打印長度爲8個字符。我正在使用dmc,lcc和OpenWatcom編譯器。這只是我使用字符串數據類型的其他大型程序的一小部分,所以我現在能做什麼,以及非常感謝您回答我的問題:)使用指針指向字符串中的某些字符

+1

's2' ia一個8個char指針的數組。 '* s2'就是這樣一個指針。 'char'指針不存儲字符,它指向它們。一個'char'數組存儲字符。 –

+0

你爲什麼預測產出「發達」?你認爲「開發」有8個字符嗎?它有9個(或10個,但是這是一個不同的對話)。它絕對沒有8個字符。 –

+1

還必須注意:不要在C++中使用數組和指針。它有'std :: string',這就是你應該使用的數據類型。 –

回答

5

s2是一個指向char的長度爲8的指針數組。您將第一個元素指向從位置10開始的s1。就是這樣。您沒有使用該數組的其餘元素。因此,s2的長度是無關緊要的。

你可以這樣做,而不是:

char* s2 = &s1[10]; 

如果你想創建一個字符串出的s1一部分,你可以使用std::string

std::string s3(s1+10, s1+19); 
std::cout << s3 << endl; 

請注意,此分配它自己的內存緩衝區並保存副本或原始字符序列。如果你只想看到另一個字符串的一部分,你可以很容易地實現一個類,它包含一個開始和一個結束指針。這裏有一個草圖:

struct string_view 
{ 
    typedef const char* const_iterator; 
    template <typename Iter> 
    string_view(Iter begin, Iter end) : begin(begin), end(end) {} 

    const_iterator begin; 
    const_iterator end; 
}; 

std::ostream& operator<<(std::ostream& o, const string_view& s) 
{ 
    for (string_view::const_iterator i = s.begin; i != s.end; ++i) 
     o << *i; 
    return o; 
} 

然後

int main() 
{ 
    char s1[] = "This is a developed country."; 
    string_view s2(s1+10, s1+19); 
    cout << s2 << endl; 
} 
+0

謝謝,但我不能使用字符串DT出於某種原因,實際上我創建一個搜索算法來搜索文件中的某個給定的字符串,其中我的邏輯是>>>>>>>在輸入模式下獲取文件,使用get(line,80,'delim'); ,我會找到要在其中搜索的字符串,所以我將從行[80]創建子字符串。 –

1

s2是一個指針數組char*。你只使用這個數組中的第零個元素。

&s1[10]指向字符串s1中的第11個字符。該地址被分配給s2的第零個元素。

cout聲明中,*s2相當於s2[0];。因此cout << *s2;輸出s2的第零個元素,該元素已分配給s1的第11個字符。 cout將沿着內存滾動,直到到達字符串的空終止符。

1

字符串必須是NULL終止又名\0s2的開頭很好,但cout會繼續閱讀直到結束。如果您想要輸出,您必須實際複製數據,而不是簡單地設置指針。

1

你的錯誤是認爲

char *s2[8]; 

聲明一個指針的8個字符(或等價,一個指向字符串與-正好8個字符)的數組。它沒有做那些。它不是聲明一個指向數組的指針,而是聲明一個指針數組。

如果你想s2是一個指針數組的-8字符,則需要:

char (*s2)[8]; 

但是,這仍然搞砸。你問:

我該怎麼做,以便變量* s2將只存儲它的長度?

你認爲它的長度是8嗎?試圖回答這個問題之前,返回到您的s1定義:

char s1[80]={"This is a developed country."}; 

是長度80或28?答案要麼取決於你如何定義「長度」 - 數組的長度或直到空終止符的長度?

所有這些關於大小的誤解都無濟於事。作爲@ n.m。在評論中指出,C++中所有指針問題的解決方案是停止使用指針。 (道歉,如果我有錯意譯納米!)

#include<iostream> 
using namespace std; 
int main() 
{ 
    string s1="This is a developed country."; 
    string s2; 
    s2 = s1.substr(10, 9); 
    cout << s2; 
    return 0; 
} 
1

如果你想這樣做貧民窟的風格和跳過的std :: string由於某種原因,你可以隨時使用strncpy()函數,memcpy的或等的strstr

int main() 
{ 
    char s1[80]="This is a developed country."; 
    char s2[10]; 
    strncpy(s2,s1+10,9); 
    s2[9] = '\0'; 

    std::cout << s2 << std::endl; 

    std::cin.get(); 
    return 0; 
} 
1

s2是一個char類型的arry,arry的元素是char *,所以你不能用它來存儲一個字符串。如果你想獲得字符串中的「開發」,你可以編寫這樣的代碼:

#include<iostream> 
using namespace std; 
int main() 
{ 
    char *s1[]={"This", "is", "a", "developed", "country."}; 
    char *s2[8]; 
    s2[0]= s1 + 3; 
    cout<<s2[0]; //Predicted OUTPUT: developed 
        // Actual OUTPUT: developed country. 
    return 0; 
}