2013-04-15 5 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#define MAXLINE 512 
main(int argc,char* argv[]){ 
    int k; 
    for (k=0; k<=argc; k++) { 
     if (k%2==0) { 
      if (fork()==0){ 

    FILE *fi; 
    FILE *fo; 
    int i; 
    fi=fopen(argv[k], "r"); 
    fo=fopen("temp.txt","w"); 
    if (!fi) 
     return; 
    char linie[MAXLINE],*p; 
    for (; ;) { 
     p = fgets(linie, MAXLINE, fi); 
     if (p == NULL) 
      break; 
     linie[MAXLINE-1] = '\0'; 
     int k=-1; 
     for (i = 0; i <MAXLINE; i++) { 
      if (linie[i]=='\n') k=i; 
     } 
     for (i = k; i >= 0; --i) { 
      fprintf(fo,"%c", linie[i]); 
     } 
    } 
    fclose(fi); 
    fclose(fo); 
       exit(1);} 
     } 
else 
{ 
    if (fork()==0){ 
     execl("/usr/bin/awk","awk","-f","ouk.awk",argv[k],NULL); 
     exit(1); 
    } 

} 
    } 

    }; 

здесь содержание ouk.awk файлC EXEC, AWK, не работает

{ for (i=NF;i>=1;i--){ if(s){s=s" "$i} else{s=$i }}{print s;s=""}} 

В основном то, что я пытаюсь сделать, это создать ряд ARGC процессов и число четное, чтобы отразить текст в файле, и если не переставить слова из каждой строки в обратном направлении, проблема я облицовкой

fprintf (Ф.О., «% с», строка [J])

не работает, и я получаю сообщение об ошибке при попытке выполнить команду AWK скрипт

awk: can't open file > 
input record number 6, file > 
source line number 1 

если я запускаю только команды AWK в терминале с теми же файлами, он отлично работает, поэтому он должен иметь что-то делать с командой execl. более

Одна вещь, я попытался следующую команду, чтобы переименовать temp.txt Int ARGV [K]

execl("bin/mv","temp.txt",argv[k],NULL) 

, но он выходит из строя.

Если кто-то может мне помочь или дать мне ссылку на команды с урока хорошо ехес было бы фантастическим, спасибо большое

ответ

1

Петля for собирается за пределы массива (это неопределенное поведение) :

for (k=0; k<=argc; k++) { 
    /* ...snip... */ 
    fi=fopen(argv[k], "r"); 

в ноль на основе массивов имеют индекс, работающий от 0 до N-1, где N это количество элементов в массиве. Условие завершения операции for должно быть k < argc. Кроме того, первый элемент в argv это название программы, которую вы хотите исключить:

for (k = 1; k < argc; k++) 

При вызове execl() вам нужно, чтобы бросить последний аргумент в char*:

execl("/usr/bin/awk","awk","-f","ouk.awk",argv[k], (char*)NULL); 
+0

«(char *) NULL "не нужно, чтобы он работал с NULL слишком ... – JackRobinson

+0

@JackRobinson, он может работать, но со ссылкой на ссылочную страницу: _ Список аргументов должен быть прерван указателем NULL, и, поскольку это переменные функции, этот указатель должен быть отличен (char *) NULL._ – hmjd