-1

コマンドラインからn個の引数arg1、arg2 .... argnを取得し、n個のスレッドを作成し、それぞれがテキストファイルargiを読み取り、偶数行を逆順に出力するプログラムを作成する必要があります。

問題は、私のプログラムがスレッドを作成して終了することですが、実際には何もしません。彼は、ランタイムごとに異なるいくつかのランダムな文字のみを出力します(メモリからの文字だと思います)。

以下は私のコードです:

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXLINE 100
pthread_t myThread[10];
pthread_mutex_t myMutex;

void * fileprint(void * numei) {
    printf("Thread: %ld ...> %s\n", pthread_self(), (char*)numei);
    FILE *fi;
    char line[MAXLINE], *p;
    pthread_mutex_lock(&myMutex);
    int k=0;
    fi = fopen((char*)numei, "r");
    for ( ; ; ) {
        k++;
        p = fgets(line, MAXLINE, fi);
        if (p == NULL) break;
        line[strlen(line) - 1] = '\0';
        if(k %2 ==0){
            for(int j=strlen(line);j>=0;j++){
                printf("%c", line[j]);
            }
        printf("%c","\n");
        }
    }

    fclose(fi);

    printf("Finished thread: %ld ...> %s\n", pthread_self(), (char*)numei);
    pthread_mutex_unlock(&myMutex); 

}


int main(int argc, char* argv[]) {
    pthread_mutex_init(&myMutex, NULL); 
    printf("I'm the father...\n");  

    int i;
    for (i = 1; argv[i]; i++) {
        pthread_create(&myThread[i], NULL, fileprint, (void*)argv[i]);
        printf("Created thread: %ld ...> %s\n", myThread[i], argv[i]);
    }


    for (i = 1; argv[i]; i++) {
        pthread_join(myThread[i], NULL);    
    }

    printf("I'm still the father...\n");


    pthread_mutex_destroy(&myMutex);

    return 1;
}

それで、誰が私に何が問題なのか教えてもらえますか?いろいろ改造しようと思ったのですが、どうにもなりません...

4

3 に答える 3

4

文字列を逆方向にたどる場合は、ループ内でインデックスをデクリメントする必要があります ( j--)。また、 から開始する必要がありますstrlen(x)-1

于 2013-11-12T09:19:56.287 に答える
3

この行は正しくありません:

printf("%c","\n");

のオペランドは ではなく で%cなければなりcharませんchar*。次のいずれかである必要があります。

printf("%c",'\n');

また:

printf("%s", "\n");

また:

printf("\n");

ただし、これによりセグメンテーション違反が発生するとは思いません。ランダムな文字が印刷されるだけです。

于 2013-11-12T09:20:13.193 に答える
0
for (i = 1; argv[i]; i++) {

「argc」も使用できます。これは引数カウンターです。

 printf("Thread: %ld ...> %s\n", pthread_self(), (char*)numei);
FILE *fi;
char line[MAXLINE], *p;
pthread_mutex_lock(&myMutex);

fileprint(...) で、printf(...) をミューテックスの後ろに配置します。そうしないと、他のスレッドがそれを中断し、出力に半分印刷された奇妙な文が表示される可能性があります。

製造

于 2013-11-12T09:29:52.067 に答える