gpt4 book ai didi

c - 如何重写我的 if 语句才能工作?

转载 作者:太空宇宙 更新时间:2023-11-04 04:18:42 24 4
gpt4 key购买 nike

所以程序基本上应该做的是我们在命令行中输入文件名 -i input.txt -o output.txt -c(命令行参数(argc 和 argv))并且程序应该读取输入文件,计算如何有很多单词,如果有 -c 它应该将所有大写字母转换为小写字母并忽略标点符号。然后统计每个单词出现的次数,并将结果输出到ouput.txt中。如果没有 -i input.txt 它应该提示用户输入并执行相同的操作,如果没有 -o output.txt 它应该在编译器中打印输出。所以在我的程序中不起作用的是 if(argc == 4)if(argc == 3)。我现在没有 wordOccurrences 的功能。我知道标题“count.h”不应该像标题,但现在它可以工作。

主文件

#include "count.h"
#include <stdio.h>``
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include "functions.c"

int main(int argc, char **argv)
{
//Initialize variables
FILE *fp; //file
char buffer[1000];

char *input; //for manually entering string with -c
input = (char*)malloc(100 * sizeof(char));

int wordcount; // the number of words

int *ch; //a single character
ch = (int*)malloc(100000 * sizeof(int));

char consoleInput[60];

if(argc >=2)
{
if(argc == 6) //if argc = 5 --> wordcount -i .txt -o .txt -c
{
//for (int i=0; i<=argc; i++)
//{
// if line has -i
if (strcmp("-i", argv[1]) == 0)
{
//open file on directory after -i
fp = fopen(argv[2],"r");

//do wordcount method
wordcount = countForFile(fp, wordcount);

//close file
fclose(fp);
}// end of first if

// if line has -o
if(strcmp("-o", argv[3]) == 0)
{
//open file on directory after -o
fp = fopen(argv[4], "w");

//put wordcount in file
fprintf(fp,"%d", wordcount);
printf("Putting output to file\n");

//close file
fclose(fp);
} // end of second if

//if line has -c
if(strcmp("-c", argv[5]) == 0)
{
//open file on location 2
fp = fopen(argv[2],"r");

// do toLowerCase method
toLowerCase(fp,ch);

//open file on location 2
fp = fopen(argv[2],"r");

//count occurances

printf("Well countOccurances is in process\n");

//close file
fclose(fp);

} //end of third if

//}
}
if (argc == 5) // if argc = 4 --> wordcount -i .txt -o .txt
{
//for (int i=0; i<=argc; i++)
//{
// if line has -i
if (strcmp("-i", argv[1]) == 0)
{
//open file on directory after -i
fp = fopen(argv[2],"r");

//do wordcount method
wordcount = countForFile(fp, wordcount);

//close file
fclose(fp);
}// end of first if

// if line has -o
if(strcmp("-o", argv[3]) == 0)
{
//open file on directory after -o
fp = fopen(argv[4], "w");

//put wordcount in file
fprintf(fp,"%d", wordcount);
printf("Putting output to file\n");

//close file
fclose(fp);

} // end of second if
//}
}
else if(argc == 4) // if argc = 3 -> wordcount -i txt -c; wordcount -o txt -c
{
//for (int i=0; i<=argc; i++)
//{
if(strcmp("i",argv[1]) == 0)
{
printf("first i if working\n");
if(strcmp("i",argv[1]) == 0)
{
//open file on directory after -i
fp = fopen(argv[2],"r");

//do wordcount method
wordcount = countForFile(fp, wordcount);

//close file
fclose(fp);
printf("I if working\n");
}
//if line has -c
if(strcmp("-c", argv[3]) == 0)
{
//open file on location 2
fp = fopen(argv[2],"r");

// do toLowerCase method
toLowerCase(fp,ch);

//open file on location 2
//fp = fopen(argv[2],"r");

//count occurances

printf("Well countOccurances is in process\n");

//close file
fclose(fp);

} //end of third if
}
else if(strcmp("-o",argv[1]) == 0)
{
printf("Enter q to exit\n");
printf("Enter text: ");
wordcount = count(input, wordcount);

if(strcmp("-o", argv[1]) == 0)
{
//open file on directory after -o
fp = fopen(argv[2], "w");

//put wordcount in file
fprintf(fp,"%d", wordcount);
printf("Putting output to file\n");

//close file
fclose(fp);
} // end of second if

//if line has -c
if(strcmp("-c", argv[3]) == 0)
{
//open file on location 2
fp = fopen(argv[2],"r");

// do toLowerCase method
toLowerCase(fp,ch);

//open file on location 2
fp = fopen(argv[2],"r");

//count occurances

printf("Well countOccurances is in process\n");

//close file
fclose(fp);

} //end of third if
}
//}
}

if(argc == 3) // if argc = 2 -> wordcount -i txt; wordcount -o txt
{
//for (int i=0; i<=argc; i++)
//{
if(strcmp("i",argv[1]) == 0)
{
//open file on directory after -i
fp = fopen(argv[2],"r");

//do wordcount method
wordcount = countForFile(fp, wordcount);

//close file
fclose(fp);
printf("PLS WORK\n");
}
else if(strcmp("-o", argv[1]) == 0)
{
printf("Enter q to exit\n");
printf("Enter text: ");
wordcount = count(input, wordcount);

//open file on directory after -o
fp = fopen(argv[2], "w");

//put wordcount in file
fprintf(fp,"%d", wordcount);
printf("Putting output to file\n");

//close file
fclose(fp);
} // end of second if
//}
}
if(argc == 2) //wordcountMain -c
{
//for (int i=0; i<argc; i++)
//{
//converting from UpperCase to LowerCase
if(strcmp("-c", argv[1]) == 0)
{
//Get input
printf("Enter text: ");
fgets(input,1000,stdin);

int i = 0;
//Loop through input
for( i = 0;input[i]!='\0'; i++)
{
//find upperCase letters
if(input[i] >= 'A' && input[i] <= 'Z')
{
//overwrite to lowerCase
input[i] = tolower(input[i]);

//input[i] = input[i] +32;
printf("Converted upperCase to lowerCase\n");

}//end of if statement

//ignoring punctuation
if(input[i] == ',' || input[i] == '.' || input[i] == '!' || input[i] == '?' || input[i] == '"' || input[i] == ':' || input[i] ==';' || input[i] == '-')
{
input[i] = ' ';
printf("Converted without punctuation\n");
}
} //end of for loop

printf("%s",input);
}
//}
}
}
else
{
//Get input
printf("Enter text: ");
//fgets(input,1000,stdin);
wordcount = count(input, wordcount);
printf("%s",input);
wordcount = count(input, wordcount);
}
return 0;
}

计数.h

# pragma once
// This file needs to know what printf is
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

//count how many words for read file
int countForFile(FILE *file, int wordcount)
{
int ch;
int linecount, charcount;


// Initialize counter variables
linecount = 0;
wordcount = 0;
charcount = 0;


// If file opened successfully, then write the string to file
if ( file )
{
//Repeat until End Of File character is reached.
while ((ch=getc(file)) != EOF) {
// Increment character count if NOT new line or space
if (ch != ' ' && ch != '\n') { ++charcount; }

// Increment word count if new line or space character
if (ch == ' ' || ch == '\n') { ++wordcount; }

// Increment line count if new line character
if (ch == '\n') { ++linecount; }

}
}
else
{
printf("Failed to open the file\n");
}
printf("Words : %d \n", wordcount);

getchar();
return wordcount;
}

/*
Hello, Bye, Hello;

int index = 2;
String[] words = [Hello, Bye, null];
int [] count = [2, 1, 0,];
*/
int count(char *input, int wordcount)
{
wordcount = 0;
while(scanf("%s",input) != EOF)
{
if(input[0] == 'q' && strlen(input) == 1)
break;
wordcount++;

}// end of while loop

printf("WordCount is: %d\n", wordcount);
getchar();
return wordcount;
}

函数.h

#include "count.h"
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

//Check for UpperCase and turn into LowerCase for a read file
toLowerCase(FILE *fp,int *ch)
{
//Initialize variables
int single_character;
int i =0;

//if file is read
if ( file )
{
//Repeat until End Of File character is reached.
while ((single_character=getc(fp)) != EOF)
{
//check every single character if it's a upperCase
if(single_character >= 'A' && single_character <= 'Z')
{
//if it is overwrite it to lowerCase
single_character = tolower(single_character); //overwrite
}
ch[i] = single_character;
i++;
} //end while
} //end if

//if file not opened
else
{
printf("Error: File not opened\n");
} //end else

getchar();

printf("toLowerCase Working\n");

} // end toLowerCase

是的,如果有任何帮助,我将不胜感激。我是 C 的新手,如果您对我应该如何使程序工作有其他想法,请发表您的想法。任何事情都会有帮助。

最佳答案

我会做这样的事情:

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <unistd.h>


int main(int argc, char const *argv[]) {

char *input_file = NULL;
char *output_file = NULL;

unsigned int threshold = 0;

unsigned int wordcount = 0;

int c;

while(1) {
static struct option long_options[] = {
{"input_file", required_argument, 0, 'i'},
{"output_file", required_argument, 0, 'o'},
{"threshold", required_argument, 0, 'c'},
{0, 0, 0, 0}
};
/* getopt_long stores the option index here. */
int option_index = 0;

c = getopt_long (argc, argv, "iot",
long_options, &option_index);

// Detect the end of the options

if(c == -1)
break;

switch(c) {
case 'i':
input_file = optarg;
break;
case 'o':
output_file = optarg;
break;
case 'c':
threshold = atoi(optarg);
break;
case '?':
/* getopt_long already printed an error message. */
break;

default:
abort ();
}



}

if (input_file == NULL || output_file == NULL || threshold == 0) {
fprintf(stderr, "ERROR, Usage: %s -input_file=<fileName> -output_file=fileName -threshold=<value>\n", argv[0]);
return 1;
}

// NOW input_files, outpuf_files and threshold contain the wanted values
// The real algorithm begins


FILE *fp = fopen(input_file, "r");

//calculate filesize (limits the size of file to s32 bytes)
unsigned int fileSize = 0;
fseek(fp, 0L, SEEK_END);
fileSize = ftell(fp);
rewind(fp);

char *file = malloc(fileSize * sizeof(char));

fread(file, sizeof(char), fileSize, fp); // WARNING: ALLOCATING MEMORY FOR THE WHOLE FILE
// FOR BIG FILES CONSIDER USING A BUFFER

for (int i = 0; i < fileSize; ++i) {
if(file[i] == ' ' || file[i] == '\n')
wordcount++;

}
wordcount++; //counting last word;

return 0;
}

在这个例子中我使用了 getopt用于解析命令行参数(argv 数组)的库。这个程序应该这样调用:
./programName --input_file="文件名"--output_file="文件名"--threshold=value

此外,我注意到您转换了内存分配函数的返回值。在 C 编程语言中,这通常被认为是不好的做法,有关更多信息,请参阅 here .

我的程序不完整,不包含任何逻辑,那部分你应该尝试单独完成(如果你不知道如何实现算法的某些部分,你可以随时询问)。

我还想谈谈如何从文件中读取数据。通常你想避免做像我所做的事情(分配一个包含整个文件的数组),因为当处理大文件时,内存需求变得过高。另一方面,您正在做相反的事情:您一次检索 1 个字节(或字符),然后立即在计算中使用它的值。这会导致您的程序在文件大小增加时变得非常慢。这是因为对文件的 I/O 操作是一项非常耗时的任务。没有“正确”的解决方案,这完全取决于具体情况:如果您知道文件大小不会太高(大约 10^2 MB)并且主内存 (RAM) 不是问题,那么也许您应该做一些类似于我所做的事情。如果文件大小可以变得非常大,那么您可能应该使用缓冲区(在这种特定情况下,它会使程序非常复杂)。当文件大小变得非常大时,所有这些问题都会出现,如果您知道它们不会那么我的方法通常更快并且没有真正的禁忌症。

关于c - 如何重写我的 if 语句才能工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48956967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com