回 帖 发 新 帖 刷新版面

主题:刚发现了一个很有意思的问题,不是很明白原因,大家一起来探讨一下

#include <iostream>

using namespace std;
int fun(char *ps,char *pt)
{
    int len_ps=0;
    while(*ps)
    {
        ps++;
        len_ps++;
    }
    cout<<"ps="<<ps<<endl;
    cout<<"ps-3="<<ps-3<<endl;//谁能帮我解释下这句以后的输出结果是怎么来的
    cout<<"*(ps-3)="<<*(ps-3)<<endl;
    cout<<"&(*(ps-3))="<<&(*(ps-3))<<endl;
    return len_ps;
int main()
{
    char *psc=new char;
    cout<<"请输入一个字符串:"<<endl;
    cin>>psc;
    int pf;
    pf=fun(psc);
    return 0;
}
我是想做一个分配动态内存来存放用户输入的字符串,然后来求字符串的长度;在无意中发现了这个问题 有高手帮忙解释下,小弟感激不尽

回复列表 (共3个回复)

沙发

我想这个大概不是什么问题吧?
比如我输入motherfucker这个词,嘿嘿。。改了下lz的程序运行结果如下:
ps = (空)
ps - 3 = ker
*(ps - 3) = k
&(*(ps - 3)) = ker
 由这句while(*ps)
    {
        ps++;
        len_ps++;
    }
退出循环后*ps = '\0'.字符串遇'\0'结束ps - 3指针指向字符k所在位置。。然后你懂的。。注意区别字符和字符串。

板凳

你写的这些有神马意思啊?!没觉得一点有意思。
首先,说穿了就是指针的移动和算术运算而已。而且,你写的也不对啊。
 while(*ps)
    {
        ps++;
        len_ps++;
    }
你的fun看起来就是想得到串长,OK, 你需要一个指针来移动,而不需要改变形参ps, ps++了,你返回了什么呢?
其次, 如果你对流还不是很熟悉的话,我建议你还是使用C的IO吧,看起来你压根儿就没明白cout和cin是怎么回事,所以,更不可能知道重载的<<和>>操作是怎么回事。
最后,既然要new,那么,多大空间呢? new char ? 我擦,我见到这样的代码,就像骂娘。 写的什么玩意儿啊。一种类型的对象产生的时候,要参照方案的,也就是我们常说的构造函数,如果,你不需要,那么会根据一个默认(default)的方案进行,总之,是需要一个的。这是合情合理的。那么,既然你要动态的构造一个串,那么构造的方式是如何呢?空间大小是起码的参数。默认? OK,cin>>psc又要做什么呢? 等于,你告诉我,你想吃饭,而又不想张嘴,那你吃还是不吃呢? 如果我是编译器,我真想抽你。
过激的言语请见谅。

3 楼

初出茅庐,进来学习

我来回复

您尚未登录,请登录后再回复。点此登录或注册