2012-11-30 166 views
1

我正在做一个字符数通过char c = cin.get()。我的输出的实施例将是: 一个:53 B:32个 C:29 等。什么原因导致字符数不准确,真的很大?

对于字母表中的一个,我发现了一个大疯狂9位数字。然后当我使用另一个具有更多字符的输入文件时,这些数字是6位数字,太大而不准确。这种表型的任何想法?

再次,对不起,这是学期末的紧缩时间。我很感激那里的任何帮助。

int main (int argc, char *argv[]) 
{ 

int count [26] = { }; 
char alpha [26] = { }; 

char c; 

c = cin.get();  
while(!cin.eof()) 
{ 
    if (isalpha(c)) 
    { 
    c = tolower(c);  
    }  

    count [ c - 'a']++; 
    alpha [ c - 'a'] = c; 

    c = cin.get(); 
    }  

    for (int i = 0; i<26; i++) 
    { 
    cout << alpha[i] << ":" << count[i] << endl; 
    } 

    } //end main  

这里的输出:(编辑)

a:224 
b:50 
c:70 
d:20 
e:167772180 
f:10 
g:40 
h:66 
i:28 

这里的输入:(编辑)

aaaaaaaaAAAAAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBBBB

制造这些改变,BU t将其仍然“悬”:

c = cin.get();  
while(c=cin.get()) 
{ 
    c = tolower(c); 
    if (isalpha(c)) 
     continue;  


    count [ c - 'a']++; 
    alpha [ c - 'a'] = c; 

    }  

    for (int i = 0; i<26; i++) 
    { 
    cout << alpha[i] << ":" << count[i] << endl; 
    } 

    } //end main  
+1

您不应该假定ASCII正在使用中,或者使用'while(!eof())'。改用'while(cin.get(c))'。 – chris

+1

和显而易见的问题,你输入所有26对是吗? –

+0

@KarthikT所有26个字母,一些大写。但是,每个字母要么一致地大写,要么小写。 – harman2012

回答

4

如果输入文件包含比点儿别的字母,任何事情都有可能发生,因为你正在访问的阵列wtih出界指数。也许你的意思是:

while(!cin.eof()) 
{ 
    if (isalpha(c)) 
    { 
     c = tolower(c);  

     count [ c - 'a']++; 
     alpha [ c - 'a'] = c; 
    } 

    c = cin.get(); 
}  

例如当您的数据包含换行符(10)时,您正在访问索引为10 - 97 = -87的alpha。这可能写入count[4]的最重要字节10。

+0

你是不是指'(isalpha(c))'? – harman2012

+0

@ harman2012 - 刚刚意识到'continue'也会在循环结束时跳过'cin.get()'。编辑我的答案。 – Henrik

+0

是的,新的线条是有道理的!尽管查看该文件,但会在“s”处返回一个新行。我会仔细检查这个新发现。因此,较小的文件起作用,并且将计数放在isalpha()下是有意义的。非常感谢! – harman2012

相关问题