2017-07-07 72 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