Попытка создать многопоточную C программу, которая печатает строку в обратном порядке - PullRequest
0 голосов
/ 02 марта 2020

Я работаю над заданием для моего класса кодирования C, которое требует от нас создания нескольких потоков, выполняющих разные функции. Чтобы облегчить путаницу, я пытаюсь выполнять программу по одному потоку за раз, но у меня возникают некоторые проблемы. Вот мой код:

   #include <pthread.h>
   #include <stdio.h>
   #include <stdlib.h>
   #include <math.h>
   #include <string.h>

   void * print_string_in_reverse_order(void *str)
   {
       // This function is called when the new thread is created
       printf("%s","In funciton start_routine(). Your string will be printed backwards.");
       char *word[50];
       strcpy (*word, (char *)str);

       int length = strlen(*word);

       for (int x = length-1; x >= 0; x--){
          printf("%c",&word[x] );
       }
       pthread_exit(NULL); // exit the thread
   }

int main(int argc, char *argv[])
{
    /* The main program creates a new thread and then exits. */
    pthread_t threadID;
    int status;
    char input[50];
    printf("Enter a string: ");
    scanf("%s", input);
    printf("In function main(): Creating a new thread\n");
    // create a new thread in the calling process
    // a function name represents the address of the function
    status = pthread_create(&threadID, NULL, print_string_in_reverse_order, (void *)&input);

    // After the new thread finish execution
    printf("In function main(): The new thread ID = %d\n", threadID);

    if (status != 0) {
            printf("Oops. pthread create returned error code %d\n", status);
            exit(-1);
    }
    printf("\n");

    exit(0);
 }

В настоящее время, хотя у меня нет ошибок компиляции, он ничего не печатает и, по-видимому, не переворачивает строку. Я очень новичок в C, поэтому я предполагаю, что это что-то вроде ошибок с моими указателями, но даже после нескольких изменений и попыток я не могу понять, в чем дело. У кого-нибудь есть идея?

1 Ответ

2 голосов
/ 02 марта 2020

Если word должен быть массивом char, содержащим строку, строку

char *word[50];

следует изменить на:

char word[50];

Кроме того, строка

strcpy (*word, (char *)str);

должна быть изменена на:

strcpy (word, (char *)str);

Кроме того, Строка

printf("%c",&word[x] );

должна быть изменена на:

printf("%c", word[x] );

Также, прежде чем вернуться из функции main(), вы должны дождаться созданный поток завершается до sh, добавляя следующую строку:

pthread_join( threadID, NULL );

В противном случае ваш поток может быть преждевременно прерван.

...