请问一个求输入字符的种类、个数的有关问题

请教一个求输入字符的种类、个数的问题
代码如图:
请问一个求输入字符的种类、个数的有关问题
请问一个求输入字符的种类、个数的有关问题

例如输入 CSDN。
若没圈出的那两句输出为:
请问一个求输入字符的种类、个数的有关问题

有有那两句则输出正确:
请问一个求输入字符的种类、个数的有关问题

想问下:圈出的两句的意思是不是“若为空格则跳出”?
       还有为什么这两句改变的这么多,怎么解释?

Ps: 用的是code::blocks
   代码为:
   #include <iostream>

using namespace std;

int main()
{
   cout<<"string : "<<endl;
   const int N=200;
   char cha[N],letters[N];
   int k,i,counts[N]={0};
   cin.getline(cha,N,'\n');
   for(i=0;i<=N;i++)
    {
        if (cha[i]=='\0')
        break;
        k=tolower(cha[i]);
        counts[k]++;

    }
    for(k=0;k<=N;k++)
    {
        letters[k]=(char)(k);
        if(counts[k]>0)
        cout<<letters[k]<<": "<<counts[k]<<endl;
    }
   return 0;
}


多谢~

------解决方案--------------------
C数组以'\0'结尾,过了'\0'之后后面的就都是无效区域了。如果不加的话,for循环会一直运行201次,并统计那些不属于你输入内容的不可知随机数据。
------解决方案--------------------
引用:
C数组以'\0'结尾,过了'\0'之后后面的就都是无效区域了。如果不加的话,for循环会一直运行201次,并统计那些不属于你输入内容的不可知随机数据。

楼上所言极是
所以通常定义字符数组的时候顺便初始化下,如:
char cha[N] = {0}; // 或用之前memset[code=c]


还有一点:

    const int N = 200;
    for(k=0; k<=N; k++)  // 这里好像不能等于N了,可能会有问题的
    {
        letters[k]=(char)(k);
        if(counts[k]>0)
        cout<<letters[k]<<": "<<counts[k]<<endl;
    }

[code=c]





------解决方案--------------------
C风格的字符串(字符数组)通常以一个空字符'\0'来作为结束标记,否则在循环处理字符数组时无法知道结束没有,所以分配字符串空间(通常是动态分配)时需要在计算的长度基础上+1来为结束符预留一个字节的空间。局部字符数组在定义后系统不会为其进行初始化,所以为了防止没有结束符,通常先进行初始化
如:char str[10] = {0}; // 每个字符的值都为0(结束符'\0'的ascii码值就是0);
或者memset(str ,0 ,10);