0

I am trying to create a thread and read from stdin inside the thread. In main() have dynamically allocated memory to a 2d array based on the size given as user input. In the thread I am reading from stdin and splitting it using strtok and adding it into the 2d array. I am not sure why there is a segmentation fault, searched SO and I seem to have handled all the cases related to strtok.

This is the program -

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

int dimB;
int dimA;
char** buffer;
char* temp;


void *thread(void *threadid){
    char *buf;//[30] = {};
    size_t len = 0;
    ssize_t read;
    char *line = NULL;
    char *each;

   printf("Hello World!.\n");
   while ((read = getline(&line, &len, stdin)) != -1) {

       printf("%s || \n", line);
       each = strtok(line," ,()");
       printf("************************%s ", each);
       while(each != NULL){
               buf = each;
               strcpy(buffer[0][0], buf);
               printf("%s", buf);
           each = strtok(NULL," ,()");
       }

   }
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
    pthread_t tidMpr;
    long r;
    int i;
    dimB = atoi(argv[1]);
    dimA = atoi(argv[2]);
    pthread_t tidRdr[dimA];
    buffer = malloc(dimA * sizeof(char*));
    temp = malloc(dimA * dimB * sizeof(char));
    for (i = 0; i < dimA; i++) {
      buffer[i] = temp + (i * dimB);
    }
//Create thread Thread
    pthread_create(&tidMpr, NULL, thread, NULL);

    free(temp);
    free(buffer);

    pthread_exit(NULL);
}

The 2d array memory allocation is from this question - How do I work with dynamic multi-dimensional arrays in C?. I know I am writing everything to buffer[0][0], but that is so that I can store each in a buffer array buffer[0][1], buffer[0][2] later on based on some logic. But that shouldn't be a problem now right?

Also line is printing the correct value, whatever it is reading from stdin. So, probably strtok is the problem.

Another very similar program produces the desired output. This -

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

typedef struct { char action; int score; } Rules;
Rules rules[5] = {{'P',50}, {'L',20}, {'D',-10}, {'C',30}, {'S',40}};

int findScore(Rules* rules, char action){
  int i;
  for(i=0; i<5; i++){
    if(rules[i].action == action)
      return rules[i].score;
  }
  fprintf(stderr, "Action not present! Exiting...\n");
  exit(EXIT_FAILURE);

}

int main(int argc, char *argv[]){
  FILE *fp;
  char inputTuple[30] = {};
  char buf[30] = {};
  char* oB;
  oB = "(";
  char* cB;
  char* co = ",";
  cB = ")";
  fp = fopen(argv[1], "r");
  int score;
  char *each;
  size_t len = 0;
  ssize_t read;
  char * line = NULL;
  char *eacharray;
  int u = 0;
  char *outputTuple;
  int pad = 0;
  int g;
  if (fp == NULL)
    exit(EXIT_FAILURE);
  while ((read = getline(&line, &len, fp)) != -1) {

    each = strtok(line," ,()");
    while(each != NULL){

      if(u%3 == 0){
        outputTuple = (char *) malloc(1 + strlen(each)+ strlen(oB) );
        strcpy(outputTuple, oB);
        strcat(outputTuple, each);
      } else if(u%3 == 1){
        char q = *each;
        score = findScore(rules, q);
      } else if(u%3 == 2){
        char * str3 = (char *) malloc(1 + strlen(outputTuple)+ strlen(co) );
        strcpy(str3, outputTuple);
        strcat(str3, co);
        char *str4 = (char *) malloc(1 + strlen(str3)+ strlen(each) );
        strcpy(str4, str3);
        strcat(str4, each);

        for(pad = strlen(each); pad<15; pad++)
          strcat(str4," ");
        sprintf(buf, "%s,%d)\n", str4, score);
        printf("%s", buf);
        free(outputTuple);
        free(str3);
        free(str4);
      }
      each = strtok(NULL," ,()");
      u++;
    }    
    u = 0;
  }
  fclose(fp);

  return 0;
}

Update : strcpy(buffer[0][0], buf); seems to be the problem. When I comment it, it is producing the output. I dont understand why is that causing a problem.

Community
  • 1
  • 1
Kachu
  • 21
  • 4
  • Hard to tell when you haven't given details about the problem -- like what line was identified in it? – Scott Hunter Feb 03 '18 at 12:17
  • line is printing the correct value. Whatever it read from stdin. – Kachu Feb 03 '18 at 12:23
  • @ScottHunter I am trying to store it in different buffers based on a particular input. – Kachu Feb 03 '18 at 12:37
  • The strcpy fails because you are using a single character value as a pointer; you either meant &buffer[0][0], or the more succinct buffer[0]. When the compiler whines about incompatible integer pointer comparison, it is trying to alert you. – mevets Feb 03 '18 at 15:46

0 Answers0