简体   繁体   中英

C program for counting the number of occurrences of a word in a file using threads getting segmentation fault error

So i have the following problem: Implement a program that gets as arguments a file name followed by words. For each word, create a separate thread that counts its appearances in the given file.Print out the sum of the appearances of all words.

I'm also not sure if my code is really formatted correctly. I'm trying to figure out how to get each word to be counted in the given text file. I am trying to test out this code but I am getting a couple errors from it, the biggest being a segmentation error. If you have any pointers or advice or help, please let me know.

my code is:

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <pthread.h>

pthread_mutex_t mtx; // used by each of the three threads to prevent        other threads from accessing global_sum during their additions

int global_sum = 0;
typedef struct{
                char* word;
                char* filename;
}MyStruct;



void *count(void*str)
{
MyStruct *struc;
struc = (MyStruct*)str; 
const char *myfile = struc->filename;

FILE *f;
int count=0, j;
char buf[50], read[100];
// myfile[strlen(myfile)-1]='\0';
if(!(f=fopen(myfile,"rt"))){
     printf("Wrong file name");
}
else
     printf("File opened successfully\n");
     for(j=0; fgets(read, 10, f)!=NULL; j++){
         if (strcmp(read[j],struc->word)==0)
            count++;
     }

 printf("the no of words is: %d \n",count);  
 pthread_mutex_lock(&mtx); // lock the mutex, to prevent other threads    from accessing global_sum
 global_sum += count; // add thread's count result to global_sum
 pthread_mutex_unlock(&mtx); // unlock the mutex, to allow other  threads to access the variable
 }


int main(int argc, char* argv[]) {
int i;
MyStruct str; 

pthread_mutex_init(&mtx, NULL); // initialize mutex
pthread_t threads[argc-1]; // declare threads array 

for (i=0;i<argc-2;i++){

   str.filename = argv[1];  
   str.word = argv[i+2];

   pthread_create(&threads[i], NULL, count, &str); 
}

for (i = 0; i < argc-1; ++i)
     pthread_join(threads[i], NULL);

printf("The global sum is %d.\n", global_sum); // print global sum

pthread_mutex_destroy(&mtx); // destroy the mutex

return 0;

}

The second good bit of advice for today is to look carefully at the warnings that your compiler gives you and take heed of them. strcmp(read[j],struc->word) Your compiler must have warned you that that is wrong. You are passing a single char as the first parameter instead of const char * . That'll almost certainly result in a seg fault. – kaylum

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM