编写一个名为“ 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/