在文件中找到最长的行,签名和未签名的整数表达式之间的比较



你好,我正在研究一个在文件中找到最长的单词和行的评估,我目前正在研究它,但在收到此错误时被卡住了。

错误:签名和未签名的整数表达式[-werror = sign-compare]

之间的比较

现在我了解了这个错误,但是我很难修复它,我尝试用自己的第一个操作来修复它,但被迫寻求帮助。

#include <iostream>
#include<fstream>
using namespace std;
int main(int argc, char *argv[]) {
   int longest = 0;
   string line;
    if(argc == 0)
    {
       cout << " " << endl;
    }
   else
   {
   for(int i = 1;i<argc;i++){
      ifstream file (argv[i]); //declare in the for loop
      if (!file.is_open() ){
      cout << argv[i] << " FILE NOT FOUNDn"; // watch out for /n
      }
      else{
         while (getline(file,line))
         {
            if(line.size() > longest){
               longest = line.size();
               cout << "The length of the longest Line is: " << longest << endl;
         }
         }

}
   }
   }
   }          

我知道错误在这里:

if(line.size() > longest){ 

编辑:解决方案:解决此处的修复是使用size_t而不是int声明最长,我在尝试修复它时尝试做的是在if语句中包括size_t,这完全是错误的。

错误:int lestest = 0;右:size_t最长= 0;这仅适用于这种情况。

如前所述,您应该使longest无符号。

此外,检查argc==0应为argc<2(因为argv[0]是程序名称)。

最后,重印"最长的行"声称一条线长于当前最大

时,似乎很奇怪

奖励:无需真正需要将数据读取到字符串中,这会产生内存分配成本。您只需 count newlines之间的字节。

这是我简化的拍摄:

活在Coliru

#include <vector>
#include <iostream>
#include <fstream>
#include <iterator>
namespace {
    struct accumulator {
        size_t peak = 0;
        void operator()(size_t n) { peak = std::max(n, peak); }
    };
}
int main(int argc, char **argv) {
    accumulator sample;
    for(auto fname : std::vector<std::string>(argv+1, argv+argc)) {
        std::ifstream ifs(fname, std::ios::binary);
        if (!ifs) {
            std::cout << fname << " FILE NOT FOUNDn";
            continue;
        }
        std::istreambuf_iterator<char> f(ifs), l;
        auto scan_until = [&](char delimiter) {
            size_t count = 0;
            while (f!=l && *f++ != delimiter) ++count;
            return count;
        };
        while (f!=l) 
            sample(scan_until('n'));
    }
    std::cout << "The length of the longest line is: " << sample.peak << "n";
}

当自己的来源运行时:

The length of the longest line is: 78

奖金

简单的更改也可以打印每个文件最长的行:

活在Coliru

/Archive2/8b/001ad4e031178d/main.cpp 44
/Archive2/8b/00964b446531eb/main.cpp 37
/Archive2/8b/01880ea6d95d38/main.cpp 50
/Archive2/8b/029f129c393ce5/main.cpp 63
... 390 lines snipped...
/Archive2/8b/f94c53ac4aee45/main.cpp 93
/Archive2/8b/f9ab4b38599e1a/main.cpp 80
/Archive2/8b/fabac3a5309ea7/main.cpp 72
/Archive2/8b/fb63a91a5b2b29/main.cpp 33
/Archive2/8b/fba5d4cf806d91/main.cpp 95
/Archive2/8b/fc2fbcfddff198/main.cpp 42
/Archive2/8b/fc4bbeb11aa3e9/main.cpp 78
/Archive2/8b/fc56c06f6ed2a1/main.cpp 37
/Archive2/8b/fd5770ca49eb30/main.cpp 78
/Archive2/8b/fe0b1121edfb0a/main.cpp 59
/Archive2/8b/ff0f709404e6a1/main.cpp 84
Overall longest line: 1353

相关内容

  • 没有找到相关文章

最新更新