2015-07-21 100 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; 
}