void lower_string(char s[]) {
int c = 0;
while (s[c] != '\0') {
if (s[c] >= 'A' && s[c] <= 'Z') {
s[c] = s[c] + 32;
}
c++;
}
}
int main(int argc,char *argv[]){
if (argc<2){
printf("Usage :WI_11SI2_12S17048.exe [nama file].txt \n");
exit(0);
}
const char *filename = argv[1];
FILE *fp = fopen(filename,"r");
rewind(fp);
if (fp == NULL){
printf("file doesn't exist.\n");
exit(1);
}
//CHECK WORDS COUNT AND MAX STRING LENGHT
char chr;
int word_count=0;
int chrcount=0;
int max_chrcount = 0;
while ((chr=fgetc(fp)) != EOF ){
if (isspace(chr)){
if (chrcount > 0){
word_count++;
}
max_chrcount = chrcount > max_chrcount ? chrcount : max_chrcount;
chrcount=0;
}else{
chrcount++;
}
}
rewind(fp);
// SORTING ALL STRINGS BEFORE MAKING STRUCT
int t =0;
char buff[max_chrcount];
char buffer[word_count][max_chrcount];
while ((fscanf(fp,"%s",buff)) != EOF ){
lower_string(buff);
strcpy(buffer[t],buff);
t++;
}
for (int z =0 ; z < t ; z++){
if (buffer[z] != NULL ){
for (int b = z+1 ; b <= t ; b++){
if(strcmp(buffer[z],buffer[b]) == 0){
strcpy(buffer[b],"0");
}
}
}
}
for(int z = 0 ; z <= t ;z++){
if(buffer[z] != "0"){
printf("%s\n",buffer[z]);
}
}
return 0;
}
文件中的文字:
SEPATU DALAM KOTAK
kotak sepatu
dalam kotak sepatu yang lain ada sandal dan kaos kaki
sandal **berwarna biru** milik ibu
ayah dan ibu suka memakai sepatu
但是在打印时,我得到 berwarnabiru 和 biru 而不是 berwarna 和 biru
对不起,有人可以帮帮我吗? 最后,任何人都可以帮我在struct中存储它并输出如下:
答案 0 :(得分:0)
我可以发现以下问题:
第一个rewind(fp);
无用且错误。无用是因为在打开文件之后,文件指针已经在开头,而且是错误的,因为如果由于某种原因无法打开文件,fp
为NULL
且rewind(NULL)
未定义行为,很可能会导致崩溃。
计算word_count
是错误的,因为您只计算空格数,这比单词数少一个,除非文件以至少一个空格结尾:示例:{{ 1}}:这里有两个空格,但有三个单词。
"One two three"
会返回fgetc
,而不是int
,因此您应该char
。
int chr;
始终为if(buffer[z] != "0")
。要比较字符串,您需要false
。
最后:strcmp
包含正确计算的最大字长,但您需要多一个字节来存储max_chrcount
终止符,因此您需要:
NUL
然而,最有可能出现更多问题。
我并不完全确定char buff[max_chrcount + 1];
char buffer[word_count][max_chrcount + 1];
的目的是什么。您的意思是strcpy(buffer[b],"0")
吗?