编写一个名为“ mywc.c”的C程序,以一些选项和文本文件作为参数来模拟“ wc”命令。
  如果未提供任何选项,mywc将输出给定文件中的行数,单词和字符以及用空格分隔的文件名。
  使用–l选项时,mywc可以输出行数;
  使用–w选项时,mywc可以输出单词数;
  使用–c选项时,mywc可以输出字符数。
  如果给定的文件不存在,则会显示一条错误消息,其中包含程序名,文本文件名和因果关系(以冒号分隔)。
  该程序还应满足以下要求。
  (1)使用结构存储行数,单词数和字符数。
  (2)字符仅包括字母和数字。
  (3)选项的顺序无关紧要。
  (4)截屏时,请始终先显示文本。
  输出可能是这样的:
  
  (略)


我做了这段代码但是没有用

#include <stdio.h>
#include <string.h>

int main() {
    FILE *fp;
    char buff[255];
    char command[255];
    int c=0,i,j=0;
    int line=0;
    int word=0;
    char ch;
    char fileName[255];
    printf("*********************************************\n");
    printf("Enter command (Example -c input.txt)\n");
    printf("-c for Number of character in file \n");
    printf("-w for Number of words in file \n");
    printf("-l for Number of lines in file \n");
    printf("*********************************************\n");
    scanf("%s",command);
    //Extracting file name
    if(command[2]==' ') {
        if(command[1]=='l' || command[1]=='w' || command[1]=='c') {
            while(command[i]!='\0') {
                if(i>2) {
                    fileName[j]=command[i];
                    i++;
                }
                fileName[i]='\0';
            }
            printf("*********************************************\n");
            printf("File Name You have provided is:%s\n",fileName);
            printf("*********************************************\n");
            fp = fopen(fileName, "r");
            if(fp) {
                while(!feof(fp )) {
                    memset(buff, '\0', sizeof( buff) );
                    fgets(buff, 255, (FILE*)fp);
                    for(i = 0; buff[ i ]; i++)
                    {
                        if (buff[i] == '\n')
                            line ++,word++;
                        else if (buff[i] == ' ')
                            word ++;
                        else
                            c++;
                    }
                }
                fclose(fp);
                if(command[0]=='-' && command[1]=='w')
                    printf("Number of words in file: %i\n", word);
                else if(command[0]=='-' && command[1]=='c')
                    printf("Number of characters in file: %i\n",(c-2));
                else if(command[0]=='-' && command[1]=='l')
                    printf("Number of lines in file: %i \n", line);
                else {
                    printf("Number of words in file: %i\n", word);
                    printf("Number of characters in file: %i\n",(c-2));
                    printf("Number of lines in file: %i \n", line);
                }
                printf("*********************************************\n");
            } else
                printf("File not found");
            return;
        }


每次使用菜单选项和文本文件运行此代码时,总是会出现Segmentation fault (core dumped)错误。如何避免这种情况?

最佳答案

使用fgets,以便在一行中读取所有字符串。此处仅读取1个字符串。

或逐步获取命令。然后寻找操作。

注意:初始化i

问题

scanf读取另一件事,直到找到换行符/空格/制表符。无法在command中读取SO文件名。

while( fgets(buffer, BUFFERSIZE , stdin) ) /* break with ^D or ^Z */
{
  //process buffer
}


哪里出问题了?

scanf("%s",command); //use fgets here you are not reading everything here

//Extracting file name
if(command[2]==' ') {

if(command[1]=='l'||command[1]=='w'||command[1]=='c') {
while(command[i]!='\0')
{
if(i>2) {
fileName[j]=command[i];
i++;
}
fileName[i]='\0';
}


为了理解问题所在,您只需在阅读command之后放置一条打印语句,然后将其打印并注释掉其余代码。

关于c - c语言编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34047050/

10-15 16:03