我想将文件中的字符串复制到变量2d char中

时间:2018-05-01 09:32:14

标签: c string file

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中存储它并输出如下:

  1. sepatu:4
  2. kotak:3
  3. dalam:2
  4. dan:2
  5. ibu:2
  6. 凉鞋:2
  7. ada:1
  8. ayah:1
  9. berwarna:1
  10. biru:1
  11. kaki:1
  12. kaos:1
  13. lain:1
  14. memakai:1
  15. milik:1
  16. suka:1
  17. 杨:1

1 个答案:

答案 0 :(得分:0)

我可以发现以下问题:

  1. 第一个rewind(fp);无用且错误。无用是因为在打开文件之后,文件指针已经在开头,而且是错误的,因为如果由于某种原因无法打开文件,fpNULLrewind(NULL)未定义行为,很可能会导致崩溃。

  2. 计算word_count是错误的,因为您只计算空格数,这比单词数少一个,除非文件以至少一个空格结尾:示例:{{ 1}}:这里有两个空格,但有三个单词。

  3. "One two three"会返回fgetc,而不是int,因此您应该char

  4. int chr;始终为if(buffer[z] != "0")。要比较字符串,您需要false

  5. 最后:strcmp包含正确计算的最大字长,但您需要多一个字节来存储max_chrcount终止符,因此您需要:

    < / LI>
    NUL

    然而,最有可能出现更多问题。

    我并不完全确定char buff[max_chrcount + 1]; char buffer[word_count][max_chrcount + 1]; 的目的是什么。您的意思是strcpy(buffer[b],"0")吗?