编译器是 Visual Studio 2010
运行时弹出警示框,提示words变量在未被初始化的情况下被使用。
int main ()
{
char article[5000];
char words[500][20];
char sentences[100][100];
int countSentences=0;
int countWords=0;
char *count;
char *temp;
cout<<"请输入需要解析的英语文章:";
cin.getline(article,5000);
count=article;
temp=article;
for(int i=0;*temp!=' ';temp++,i++)
words[0][i]=*temp;
for(;*count;count++)
{
if (*count==' ') countWords++;
else if (*count=='?'||*count=='.'||*count=='!') countSentences++;
}
countWords++;
cout<<"共计 "<<countWords<<" 个英语单词"<<endl;
cout<<"共计 "<<countSentences<<" 个句子"<<endl;
cout<<*words[0]<<endl;
}
C++小白,指针的概念这一块始终有点弄不清楚。
这里的意思是这样, 把你输入的英文字母, 循环赋值到words数组中
words是一个二维数组, 第二维是一个一个的字符, 比如输入 abcdefg 那么二维上面存放的是 a 字符 b 字符 c字符 等等
但是如果访问words的第一维 那么就是一个字符串
比如 words[0][0] = 'a' words[0][1]= 'b' words[0][2] = 'c'
那么输出 words[0]表示 abc这个字符串的地址
*word[0]就会输出 字符串 'abc'
错误的话你还是吧完整的错误信息发出来我看看
在你声明words的时候,c++会分配一段地址给这个变量
里面地址的初始值不是固定的值
那个值有可能是上一次别的程序运行完之后留下来的。
这有点像去餐馆吃东西拿到了一个桌子(地址),由于那家餐馆(c++)是不会帮你收拾桌子上的东西的,在那个桌子(地址)。别人在桌子上吃完了东西有可能没收拾桌子上的东西(没有地址上的数据清掉),那你不先清理桌子(初始化数组),读取数组数据的就有可能不小心读到一些奇奇怪怪的东西。
可能是逻辑问题,你可以画一个框图
for(int i=0;*temp!=' ';temp++,i++)
words[0][i]=*temp; -->这里有问题吧
words[0]的数组宽度是20,不能一直i++,你如果想用可以把把转成指针
cahr* pctempbuff = &words[0][0];
for(int i=0;*temp != ' ' && i < 5000;temp++,i++,pctempbuff++)
*pctempbuff =*temp;
顺便再申请一下数组内存初始化什么的
#define WordsdBuffSize sizeof(char)*5000
char * article= (char*)malloc(WordsdBuffSize);
memset(article, 0, WordsdBuffSize);
free(article);
article = NULL;