2017-07-07 46 views
1

我正在盡我所能返回一個具有特定值的指針。雖然,我不明白爲什麼我會比平常多得多。我問了幾個人,我被告知我得到一個子字符串?爲什麼我會返回一系列指針返回類型的字符?

問題:我輸入單詞hotdog。 我期望在索引[2]處返回一個指針。相反,我得到了chars狗。這是爲什麼?我將如何獲得索引[2]?我正在考慮解除引用它,但是我在獲取返回類型時遇到問題。

我無法更改我的函數的返回類型或參數。

#include <iostream> 

char * GetValueAtIndex(char * const c, int index); 
void ReadString(char * c, int length); 

int main() 

{ 
    const int size = 10; 
    char ma[size]; 
    char * pointer = ma; 

    ReadString(ma, 20); 
    std::cout << GetValueAtIndex(pointer, 3) << std::endl; 
    system("pause"); 
} 

void ReadString(char * c, int length) 
{ 
    std::cin.getline(c, length); 
} 


char * GetValueAtIndex(char * const c, int index) 
{ 

    return c + index; 

} 
+0

爲什麼你期望指數[2 ]? GetValueAtIndex使用偏移量3,這將是索引[3],並且「熱狗」的第四個字母是'd',所以我期望輸出爲'狗' –

回答

0

爲什麼我返回一系列指針返回類型的字符?

你返回一個指向一個字符的指針,就像你陳述你想要做的一樣。

我期待指數在返回一個指針[2]

該指針返回,如你預期。

雖然相反,我得到了chars狗。

這是因爲您將指針插入流中。 char*的流插入運算符要求輸入是指向以空字符結尾的字符串的指針,並且行爲是要打印整個字符串。您的指針指向從字符'd'開始的一組字符。

我想提領它

如果取消引用指針,你會得到指向('d')性格:

std::cout << *GetValueAtIndex(pointer, 3) << std::endl; 
3

修改你的函數返回值不是指針:

char GetValueAtIndex(char * const c, int index){ 
    return *(c + index); 
} 

或者乾脆取消引用的函數返回一個指針:

std::cout << *GetValueAtIndex(pointer, 3); 

當你有一個char*指針,如:

char* p = "Hotdog"; 

並將p發送到std::cout它將被視爲指向C風格字符串的第一個字符的指針,並按此方式打印。 C風格字符串以\0結尾。所以它會打印出p指向的任何字符,然後打印出所有剩餘的字符,直到達到字符串\0的末尾。 如果你增加一個指針則在下一字符等指出:

char* p = "Hotdog"; 
p++; 
std::cout << p; 
p+=3; 
std::cout << p; 

如果你只需要打印一個字符的p點,然後發送一個復引用指針std::cout

char* p = "Hotdog"; 
std::cout << *p; 
+0

我編輯問題,我無法更改函數的返回類型或參數。 – don1123

+0

@ don1123這沒有意義 – Justin

+0

@ don1123如果你返回一個指向該索引處的字符的指針,那麼當你在你提供的代碼中進行打印時,它只會在遇到'\ 0'字符時停止,並且只在字符串的結尾,這就是爲什麼你的例子的輸出將是'狗'而不僅僅是'd'。 – Polb