可以告诉我这个代码有什么不对吗?它编译和一切都很好,但输出是固定的零一直下降。所以它不算数字。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const char FileName[] = "c:/test.txt";
int main ()
{
string lineBuffer;
ifstream inMyStream (FileName); //open my file stream
if (inMyStream.is_open())
{
//create an array to hold the letter counts
int upperCaseCount[26] = {0};
int lowerCaseCount[26] = {0};
//read the text file
while (!inMyStream.eof() )
{
//get a line of text
getline (inMyStream, lineBuffer);
//read through each letter in the lineBuffer
char oneLetter;
for( int n=0; n < (int)lineBuffer.length(); ++n )
{
oneLetter = char( lineBuffer[n] ); //get a letter
if (oneLetter >= 'A' && oneLetter <='Z')
{ //decide if it is a capital letter
upperCaseCount[int(oneLetter)- 65]++; //make the index match the count array
if (oneLetter >= 'a' && oneLetter <='z')
{ //decide if it is a lower letter
lowerCaseCount[int(oneLetter)- 65]++; //make the index match the count array
}//end
}//end
}
}//end of while
inMyStream.close(); //close the file stream
//display the counts
for (int i= 0; i < 26; i++)
cout << char(i + 65) << "\t\t" << lowerCaseCount[i] << char(i + 95) << "\t\t" << lowerCaseCount[i] << endl;
}//end of if
else cout << "File Error: Open Failed";
return 0;
}
答案 0 :(得分:7)
你已经得到了一些你知道的问题的帮助,现在可能还有一些你可能没有意识到的问题(还有):
while (!inMyStream.eof() )
{
//get a line of text
getline (inMyStream, lineBuffer);
你应该立刻学到的一点是,正如你所写的,这将无法正常工作。你通常想做的是:
while (getline(inMyStream, lineBuffer)) {
// .. the rest of the processing.
但是,由于您一次只处理一个字符,而忽略除字母之外的所有字符,因此一次只能读取一个字符可能更简单:
int ch;
while (inMyStream >> ch)
// process the character
由于没有其他人提及它们,我还要指出,不是明确地测试'a'和'z'来查找小写字母,而'A'和'Z'来查找大写字母,你会发现最好使用islower
和isupper
,它们在<ctype.h>
(以及其他几个地方)中提供:
#include <ctype.h>
while (inMyStream >> ch)
if (isupper((unsigned char)ch))
++upperCount[(unsigned char)ch-'A'];
else if (islower((unsigned char)ch))
++lowerCount[(unsigned char)ch-'a'];
答案 1 :(得分:6)
编辑:确实这里描述的问题不是唯一的问题,请参阅其他答案以获得更完整的解决方案。
upperCaseCount[int(oneLetter)- 65]++; //make the index match the count array
if (oneLetter >= 'a' && oneLetter <='z')
{ //decide if it is a lower letter
lowerCaseCount[int(oneLetter)- 65]++;
(至少)这两个65
中的一个是错误的。我建议改为int('A')
和int('a')
而不是......
注意:这可能不是解释您问题的原因。
答案 2 :(得分:4)
这里你的if
语句范围错误。每个字母可以 大写或小写,但是if
语句作用域的方式,如果字母已经是大写的,那么你只检查小写,这当然是荒谬的。< / p>
你想要更像的东西:
for(unsigned n = 0; n < lineBuffer.length(); ++n)
{
oneLetter = char( lineBuffer[n] ); // get a letter
if (oneLetter >= 'A' && oneLetter <='Z') {
upperCaseCount[int(oneLetter)- 'A']++;
}
else if (oneLetter >= 'a' && oneLetter <='z') {
lowerCaseCount[int(oneLetter)- 'a']++;
}
}
答案 3 :(得分:2)
您的if
大写和小写字母拼写错误。如果oneLetter
不是大写,你甚至不会看小写字母。这两个if
应该处于同一级别。
这是我能看到的唯一错误。
我建议调试,如gf建议的那样,或者抛出一些打印语句来验证你对发生了什么(或不发生)的假设。
答案 4 :(得分:1)
此代码可能存在其他问题,但有一点突出的是,计算小写字母的if语句位于if语句中,用于计算大写语句。您的测试文件可能不包含任何大写字母,因此输出为实心零。
应该有两个单独的if语句,例如:
if (oneLetter >= 'A' && oneLetter <='Z')
{ //decide if it is a capital letter
upperCaseCount[int(oneLetter)- 65]++; //make the index match the count array
}//end
if (oneLetter >= 'a' && oneLetter <='z')
{ //decide if it is a lower letter
lowerCaseCount[int(oneLetter)- 65]++; //make the index match the count array
}//end
答案 5 :(得分:0)
最后打印输出怎么样,小写字母计数打印两次?这解释了为什么它“一直向下”,因为原始代码 正确地计算大写字母不是吗?