2017-04-11 26 views
0

我试图在C++中实现wc命令,但每当我尝试运行该程序时都会发生终止(核心转储)错误。它编译没有错误,所以我不知道错误在哪里。任何代码风格的改进也将不胜感激。在wc程序中终止(核心转储)C++

#include <iostream> 
#include <string> 
#include <cstdlib> 
#include <string> 
#include <ctype.h> 
#include <unistd.h> 
#include <stdio.h> 

using namespace std; 
int main(int argc, char *argv[]) 
{                        
    setvbuf(stdout, NULL, _IONBF, 0); 
    int c_flag=0, l_flag=0, m_flag=0, w_flag=0; 
    int bytes; 
    int lines; 
    int characters; 
    int words; 
    int ch; 
    FILE *fp; 

    opterr = 0; 
    while((ch = getopt(argc, argv, "clmw::")) != 1) 
    { 
     switch (ch) 
     { 
      case 'c': 
       c_flag=1; 
       break; 
      case 'l': 
       l_flag=1; 
       break; 
      case 'm': 
       m_flag=1; 
       break; 
      case 'w': 
       w_flag=1; 
       break; 
      case '?': 
       fprintf(stderr, "wc: invalid option -- '%c'\nTry `wc --help' for more information.", optopt); 
       return EXIT_FAILURE; 
      default: 
       abort(); 
     } 
    } 
    if ((c_flag == 1) && (m_flag == 1)) 
    { 
     fprintf(stderr, "wc: cannot have both -c and -m flags\nTry `wc --help' for more information."); 
      return EXIT_FAILURE; 
    } 
    int i = optind; 
    if (i == optind) 
    { 
     printf("read stdin"); 
    } 
    else 
    { 
     for (int i = optind; i < argc; ++i) 
     { 
      string input; 
      input = string(argv[i]); 
      if (input == "-") 
      { 
       string buf; 
       char ch; 
       while(cin.get(ch)) 
       { 
        buf += ch; 
       } 
       printf("read stdin"); 
       if (c_flag) printf("c flag"); 
       if (l_flag) printf("l flag"); 
       if (m_flag) printf("m flag"); 
       if (w_flag) printf("w flag"); 
      } 
      else 
      { 
       fp = fopen(argv[i], "r"); 
       if (fp) 
       { 
        fseek(fp, 0L, SEEK_END); 
        bytes = ftell(fp); 
        rewind(fp); 
        while(!feof(fp)) 
        { 
         ch = fgetc(fp); 
         if (isspace(ch)) ++words; 
         while(isspace(ch)) 
         { 
          if(ch == '\n') ++lines; 
         } 
         ++characters; 
        } 
        printf("%d", lines); 
        printf("%d", words); 
        printf("%d", characters); 
        printf("%d", bytes); 
        if (c_flag) printf("c flag"); 
        if (l_flag) printf("l flag"); 
        if (m_flag) printf("m flag"); 
        if (w_flag) printf("w flag"); 
       } 
       else 
       { 
        fprintf(stderr, "wc: %s: No such file or directory ", argv[i]); return EXIT_FAILURE; 
       }      
      } 
     } 
    } 
    return EXIT_SUCCESS; 
} 
+3

你的调试器说了什么?这是很多代码让人们猜测哪里出了问题。调试器会完全告诉你**崩溃的位置。 – tadman

+0

仅供参考,这是C代码,而不是C++ – Mikhail

+0

它使用了一些C++ - 字符串例如 – pm100

回答

0

您检查getopt返回值时,有一个错误:

while((ch = getopt(argc, argv, "clmw::")) != 1) 

Per the function's specification,则返回-1时,有没有更多的命令行参数来处理。由于这种无效状况,您的switch属于default并致电abort

+0

谢谢,这是有道理的,为什么它叫中止。 – Char