注册 登录
编程论坛 C++教室

char 型指针变量的特点

hmsabc 发布于 2010-08-26 19:16, 2576 次点击
程序代码:

//char 型指针变量的特点

#include<iostream>
using namespace std;

int main( )
{
    char * pstr[] = { "Robert Redford",               //数组未提供参数
        "Hopalong Cassidy",
        "Lassie",
        "Slim Pickens",
        "Boris Karloff",
        "Oliver Hardy",
        "Huang MingSheng",
        "Wgh miss"
    };                                                 //声明指针数组,并赋初值,注意有分号

    int count = (sizeof pstr) / ( sizeof pstr[0]);

    char * pstart = "Your lucky star is " ;            //声明一个 char 型指针,并赋初值 这是 char 型指针变量的特点
    int dice = 0;
   
    cout << endl
        << " Pick a lucky star!" << endl
        << " Enter a number between 1 and " << count << ": ";
    cin >> dice;                                        //输入数据


    cout << endl;


        if(dice >= 1 && dice <= count)                 //如果 1 <= dice <= count
            cout << pstart << pstr[dice - 1];  //这里第一个输出 pstart ,意味着输出的是字符串,这是 char 型指针的特点

        else
            cout << "Sorry, you haven't got a lucky star.";
    cout << endl;
    cout << "The dice bit number is: " << sizeof dice << endl;                         // 变量 dice 占用的内存字节数
    cout << "Number of array element is: " << (sizeof pstr) / ( sizeof pstr[0]) << endl;     //输出数组元素的数量

    system("pause");
    return 0;
}



[ 本帖最后由 hmsabc 于 2010-8-26 19:18 编辑 ]
9 回复
#2
无名可用2010-08-27 00:19
  
可我有一个问题不懂,下面的代码为什么会出现内存错误..
将string arr[3];定义成char arr[3][20];就不会出错..

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s="asdf er wqeqrtrwt ";
    string arr[3];
    int i=0,j=0,k=0;
    for(;s[k]!='\0';k++)
    {
        if(s[k]!=' ')
        {
            arr[i][j++]=s[k];
        }
        else if(s[k+1]!=' ')
        {
            arr[i][j]='\0';
            i++;
            j=0;
        }
    }
    if(s[k-1]!=' ')
    {
        arr[2][j]='\0';
    }
    for(int t=0;t<3;t++)
    {
        cout<<arr[t]<<endl;
    }
    return 0;
}
#3
mxs8102010-08-27 08:57
回复 2楼 无名可用
你研究一下string 的用法吧~~
string s;
s应该是个对象,而不是单纯的字符串数组~~

[ 本帖最后由 mxs810 于 2010-8-27 08:58 编辑 ]
#4
pangding2010-08-27 09:43
string 的内存是动态分配的,你用的时候它的内存可能还没分配呢,所以一写就可能出内存错误。用 [] 给 string 元素的引用,不做越界查。用 at 的话,如果出界了,会抛 out of range 异常。
这个你一般可以用 push_back 来做。凡是类似 arr[i][j++]=s[k] 的语句,你全换成 arr[i].push_bach(s[k]); 这样 j 这个变量就可以省了,这个函数是往 string 的末尾加东西。
#5
pangding2010-08-27 09:49
哦,另外不必在 string 的末尾加 '\0'。
它和 C 语言里的字符串区别还是挺大的,你可能会觉得 string 很难使,但应该只是不习惯而已。它的好多功能还是挺强大的,但用法和以前 C 语言里的很多东西不一样了。当然复杂程序也上去了。
#6
无名可用2010-08-29 00:13
换成 arr[i].push_bach(s[k])时会报错,我看了MSDN,用arr[i].insert(arr[i].end(),s[k])来代替也可以,多谢了。。
#7
pangding2010-08-29 16:45
报错?它是说没这个函数吗?
#8
无名可用2010-08-29 19:42
好像是。
error,C2039:“push_back” is not a member of basic_string<char>
#9
南国利剑2010-09-01 00:05
受教了。感谢楼主!
呵呵
#10
hmsabc2010-09-01 08:29
回复 9楼 南国利剑
互相学习,不用客气。
1