C++用C字符串计数文件中的字符、单词、句子 我是使用C字符串,而不是C++字符串对象,每个教师从输入文件中读取段落,并计算字符、单词、句子和动词、be、AM、be、IS、IS、be的数目。我当前的程序清除了编译器,但我的字符数和单词数都减少了2。我的句子计数代码在计算一个句子后停止。任何关于我的错误的帮助都将不胜感激。仍在进行调试。我的老师基本上告诉全班学生斯特托克做了什么,然后让我们从那里弄明白。不是要求你为我做这件事——只是一些提示/提示,让你回到正确的方向。复活节快乐 #include <iostream> #include <cstring> #include <fstream> #include <cstdlib> using namespace std; const int MAX_FILENAME = 256; //Longest word length = 15 chars const int MAX_WORD_CHARS = 16; //Longest word in paragraph = 200 words const int WORDS_MAX = 200; //Max amount of chars in paragraph = 15*200 const int MAX_PARAGRAPH_CHARS = 3000; //Max chars in a sentence const int MAX_SENTENCE_CHARS = 200; const int MAX_SENTENCES = 25; const int NUM_TO_BE_VERBS = 5; void readParagraph( ifstream& input, char [] ); int countWords( char [], char tp[][MAX_WORD_CHARS] ); int countSentences( char [] ); int main() { int i; int words, sentences, average; char filename[MAX_FILENAME]; ifstream input; //Holds paragraph characters char p[MAX_PARAGRAPH_CHARS]; const char TO_BE_VERBS[NUM_TO_BE_VERBS][MAX_WORD_CHARS] = { "am", "are", "is", "was", "were" }; const char BE[] = "be"; const char TO[] = "to"; char tp[WORDS_MAX][MAX_WORD_CHARS]; //Prompt user input file name cout << "Enter input file name: "; cin.get( filename, 256 ); //Open input file input.open( filename ); //Check input file exists if ( input.fail() ) { cout << "Input file " << filename << " does not exist." << endl; exit(1); } //Reads paragraph into array readParagraph( input, p ); countWords( p, tp ); countSentences( p ); return(0); } void readParagraph( ifstream& input, char p[] ) { int count = 0; while ( input.get( p[count]) && (count < MAX_PARAGRAPH_CHARS) ) { count++; } p[count - 1] = '\0'; cout << "Number of characters: " << count << endl; } int countWords( char p[], char tp[][MAX_WORD_CHARS] ) { int i = 0; char* cPtr; cPtr = strtok( p, " " ); while ( cPtr != NULL ) { strcpy( tp[i], cPtr ); i++; cPtr = strtok( NULL, " " ); } cout << "Number of Words: " << i << endl; return(i); } int countSentences( char p[] ) { int j = 0; char* Ptr; char sent[25]; Ptr = strtok( p, ".!?" ); while ( Ptr != NULL ) { strcpy( sent, Ptr ); j++; Ptr = strtok( NULL, ".!?" ); } cout << "Number of sentences: " << j << endl; return(j); }

C++用C字符串计数文件中的字符、单词、句子 我是使用C字符串,而不是C++字符串对象,每个教师从输入文件中读取段落,并计算字符、单词、句子和动词、be、AM、be、IS、IS、be的数目。我当前的程序清除了编译器,但我的字符数和单词数都减少了2。我的句子计数代码在计算一个句子后停止。任何关于我的错误的帮助都将不胜感激。仍在进行调试。我的老师基本上告诉全班学生斯特托克做了什么,然后让我们从那里弄明白。不是要求你为我做这件事——只是一些提示/提示,让你回到正确的方向。复活节快乐 #include <iostream> #include <cstring> #include <fstream> #include <cstdlib> using namespace std; const int MAX_FILENAME = 256; //Longest word length = 15 chars const int MAX_WORD_CHARS = 16; //Longest word in paragraph = 200 words const int WORDS_MAX = 200; //Max amount of chars in paragraph = 15*200 const int MAX_PARAGRAPH_CHARS = 3000; //Max chars in a sentence const int MAX_SENTENCE_CHARS = 200; const int MAX_SENTENCES = 25; const int NUM_TO_BE_VERBS = 5; void readParagraph( ifstream& input, char [] ); int countWords( char [], char tp[][MAX_WORD_CHARS] ); int countSentences( char [] ); int main() { int i; int words, sentences, average; char filename[MAX_FILENAME]; ifstream input; //Holds paragraph characters char p[MAX_PARAGRAPH_CHARS]; const char TO_BE_VERBS[NUM_TO_BE_VERBS][MAX_WORD_CHARS] = { "am", "are", "is", "was", "were" }; const char BE[] = "be"; const char TO[] = "to"; char tp[WORDS_MAX][MAX_WORD_CHARS]; //Prompt user input file name cout << "Enter input file name: "; cin.get( filename, 256 ); //Open input file input.open( filename ); //Check input file exists if ( input.fail() ) { cout << "Input file " << filename << " does not exist." << endl; exit(1); } //Reads paragraph into array readParagraph( input, p ); countWords( p, tp ); countSentences( p ); return(0); } void readParagraph( ifstream& input, char p[] ) { int count = 0; while ( input.get( p[count]) && (count < MAX_PARAGRAPH_CHARS) ) { count++; } p[count - 1] = '\0'; cout << "Number of characters: " << count << endl; } int countWords( char p[], char tp[][MAX_WORD_CHARS] ) { int i = 0; char* cPtr; cPtr = strtok( p, " " ); while ( cPtr != NULL ) { strcpy( tp[i], cPtr ); i++; cPtr = strtok( NULL, " " ); } cout << "Number of Words: " << i << endl; return(i); } int countSentences( char p[] ) { int j = 0; char* Ptr; char sent[25]; Ptr = strtok( p, ".!?" ); while ( Ptr != NULL ) { strcpy( sent, Ptr ); j++; Ptr = strtok( NULL, ".!?" ); } cout << "Number of sentences: " << j << endl; return(j); },c++,c-strings,C++,C Strings,代码和作业都有很多问题。首先,正如前面提到的,这不是专业程序员会接近这一任务的方式,因此你的老师不教学生实际使用C++感到羞愧。也就是说,通过这样的作业,还有很多东西需要学习。这里有一些问题需要你考虑和改正。< /P> 未使用的变量 未使用的变量通常是代码质量差的标志。他们把代码弄得乱七八糟,让人难以理解,也没有增加任何价值。如果您要求编译器特别挑剔,它可以帮助您发现此类问题。我使用g++编译您的代码,并使用以下命令行: g++ -Wall -Wextra -pedantic --std=c++

代码和作业都有很多问题。首先,正如前面提到的,这不是专业程序员会接近这一任务的方式,因此你的老师不教学生实际使用C++感到羞愧。也就是说,通过这样的作业,还有很多东西需要学习。这里有一些问题需要你考虑和改正。< /P> 未使用的变量 未使用的变量通常是代码质量差的标志。他们把代码弄得乱七八糟,让人难以理解,也没有增加任何价值。如果您要求编译器特别挑剔,它可以帮助您发现此类问题。我使用g++编译您的代码,并使用以下命令行:

g++ -Wall -Wextra -pedantic --std=c++11 -o stringcount stringcount.cpp
它很有帮助地指出,i、单词、句子、平均值、TO_BE_动词、BE和TO都是未使用的

使用名称空间std; 合并使用名称空间std;你写的每一个程序都应该避免。如果你的指导老师建议你使用这种结构,请注意,如果你决定为该类以外的课程编写代码,你将不得不改掉这种坏习惯

阅读段落 ReadParague例程包括以下循环:

while ( input.get( p[count]) && (count < MAX_PARAGRAPH_CHARS) ) 
该\0字符是否真的位于正确的位置?如果没有读取字符,它从哪里写入

仔细考虑这个问题 你能数一数这个句子中的单词吗?我数到八。您的程序可能没有,因为countWords函数包含以下行:

cPtr = strtok( p, " " );
std::cin.get( filename, 256 );
请注意,单词可能以句号或问号结尾,而不一定以空格字符结尾。strtok函数实际上可以在同一个调用中查找多个delmiter,因此您可能希望调整该调用

创造额外的工作 countWords函数仔细地将每个发现的单词复制到tp数组中,但是tp数组永远不会被使用。如果你不使用它,就不要创建它。它将使您的程序更持久,更容易进行故障排除,并且速度稍快。CountSequences函数中神秘的sent变量也是如此

返回不是一个函数 不要写returnj;因为return不是一个函数。相反,只需写返回j;这是更为地道的C和C++风格。 幻数 您已经在程序中对常量使用了许多const int声明,这是一件好事。然而,仍有一些神秘的、无法解释的幻数嵌入到程序中,如此行中的256:

cPtr = strtok( p, " " );
std::cin.get( filename, 256 );

请注意,我在前面添加了std::以显示当您省略using名称空间std时的效果;从你的节目中

下面介绍如何调试这样的代码,这与编写好代码的方法有关,但与之不同,首先要避免这种困境

步骤1:选择观察到的问题并将其锁定

字符计数已关闭。给定文本“红苹果”,代码报告的字符数为:10

第2步:找到相关代码并尽可能地将其剥离,同时仍显示行为

代码以字符形式计算空格和回车

第四步:修复它

你如何处理这件事取决于你希望它有多重要


返回步骤1,重复执行,直到您满意为止。

对于初学者来说,此代码不会编译。如果你不给我们看真正的代码,我们会浪费很多时间,然后才能帮助你。为什么你的老师不教你实际的C++?顺便说一下,我在C++访谈中也遇到过这样的问题:另一方面,函数参数的char[]和char-tp[][16]令人恶心!老好人K&R.@Beta:他混合了单词和单词。指针的声明中还缺少一个“c”,然后添加ifstream输入,然后进行编译。@LaszloPapp:老师可能正在标记结果,在这种情况下,这很重要。
void readParagraph( ifstream& input, char p[] )
{
  int count = 0;

  char c;
  while(input.get(c))
  {
    count++;
    cout << count << ": " << c << endl;
  }

  cout << "Number of characters: " << count << endl;
}
1: r
2: e
3: d
4:  
5: a
6: p
7: p
8: l
9: e
10: