[c]nowy wiersz, main, linux

0

Mam do napisania program, który justuje tekst, ale najpierw chcę krok po kroczku napisać i opanować funkcje, który w mniejszym lub większym stopniu przydadzą mi się do ostatecznego programu. Najpierw mój program ma za zadanie zrobić nowy wiersz w tekście, tj jeśli tekst ma dlugosc np. 40 znaków i jest on w jednym wierszu, to po wykonaniu komendy ./nowy 10 <tekst.txt> wynik.txt tekst zawarty w pliku tekst.txt zrobi '\n' po 10-tym znaku, jeśli tam jest spacja. Jeśli nie ma tam spacji, to cofnie się o kilka znaków aż znajdzie spację i tam wstawi '\n'.
Początkowy mój kod wygląda tak:

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

#define MAX 100


void nowy_wiersz(char zdanie[], int miejsce)
{
       int i;
       int j;

       for(i=0;zdanie[i]=zdanie[miejsce];i++)
       {
         if(zdanie[miejsce]!=' '){
                                 miejsce=j;
                                 while(zdanie[j]=' '){
                                            zdanie[j]='\n';
                                               --j;
                                                     }
                                  }else{
                                     zdanie[miejsce]='\n';
                                       }
       }
}

I mam problem z funkcją main.

int main()
{

   char zdanie[MAX];
   int miejsce;

   scanf("%d", miejsce);
   nowy_wiersz(zdanie,miejsce);
 return 0;
}

Który na pewno jest zły, bo po prostu nie działa. Program się kompiluje, ale po wpisaniu tej komendy, co napisałem wcześniej, wyskakuje "Naruszenie ochrony pamięci". Jak main mniej więcej powinien być napisany? Przez to nie mogę sprawdzić, czy funkcja "nowy_wiersz" jest poprawnie napisana, a pewnie nie jest:) Proszę o pomoc.</cpp>

0
scanf("%d", &miejsce);
0

o jejuś faktycznie... dzięki. Komenda niby zaskakuje, ale nic nie pojawia się w pliku wynik.txt. Czy wymagana jest jeszcze jakaś funkcja kopiująca wynik do "wynik.txt"? Czy raczej jest jakiś błąd w funkcji? w nowy_wiersz poprawiłem równości.

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

#define MAX 100


void nowy_wiersz(char zdanie[], int miejsce)
{
       int i;
       int j;

       for(i=0;zdanie[i]==zdanie[miejsce];i++)
       {
         if(zdanie[miejsce]!=' '){
                                 miejsce=j;
                                 while(zdanie[j]==' '){
                                            zdanie[j]=='\n';
                                               --j;
                                                     }
                                  }else{
                                     zdanie[miejsce]=='\n';
                                       }
       }
}

Prosiłbym o przeniesienie tematu do Newbie. Bo raczej program jest dla początkujących, a przez przypadek temat napisałem nie w tym dziale. Przepraszam za kłopot.

0

Oczywiście, dane musisz z pliku odczytać, przetworzyć i zapisać do wynikowego. Jak na razie nie pokazałeś jeszcze żadnych operacji na plikach.

0

Ok dzięki udało się. Najpierw zrobiłem funkcje, która usuwa wszystkie znaki nowej linii w tekście. Program działa. Teraz chce aby znaki nowej linii były przydzielane na miejsce, które poda użytkownik. Czyli wpisując komendę ./program 10 <text.txt> wynik.txt program zrobi entery co 10 znaków. Na razie chcę normalnie wstawiać tam '\n' bez sprawdzania czy tam jest spacja, ponieważ chcę aby program reagował na to ./program 10 <text.txt> wynik.txt a na razie coś mi nie wychodzi. To co nie działa wygląda tak:

void newline(char zdanie[], int miejsce)
{
    int i;

    int dlugosc = strlen(zdanie);
    for(i=0;i<dlugosc;i=i+miejsce){
         zdanie[i]='\n';

                    }
}

a funkcja main tak:

int main()
{
    char zdanie[MAX];
    char zdanie2[MAX];
    int miejsce;
    getline(zdanie,MAX);
    usun(zdanie);
    scanf("%d",&miejsce);
    newline(zdanie,miejsce);
    copy(zdanie2,zdanie);
    printf("%s",zdanie2);
    return 0;
}

Priorytetem na razie jest reagowanie na scanf. Po wpisaniu tej komendy co napisałem wyżej wyskakuje "Naruszenie ochrony pamięci"
Cały kod wygląda tak:

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

#define MAX 1000

void usun(char zdanie[])
{
    int i;
    char znak = '\n';	
    int dlugosc = strlen(zdanie);

    for(i=0;i<dlugosc-1;i++)
         if(zdanie[i]==znak){
               zdanie[i]=' ';
         }
}

void newline(char zdanie[], int miejsce)
{
    int i;

    int dlugosc = strlen(zdanie);
    for(i=0;i<dlugosc;i=i+miejsce){
         zdanie[i]='\n';}
}

void getline(char zdanie[], int lim)
{
   int c,i;
   
   for(i = 0;i<lim-1 && (c=getchar())!=EOF;i++)
      zdanie[i]=c;
      zdanie[i]='\0';
}

void copy(char to[], char from[])
{ 

  int i;
  i=0;

  while((to[i] = from [i])!='\0')
    ++i;
}

int main()
{
    char zdanie[MAX];
    char zdanie2[MAX];
    int miejsce;
    getline(zdanie,MAX);
    usun(zdanie);
    scanf("%d",&miejsce);
    newline(zdanie,miejsce);
    copy(zdanie2,zdanie);
    printf("%s",zdanie2);
    return 0;
}

Proszę o pomoc.

EDIT:

Już znalazłem rozwiązanie. Jest takie coś jak argc i argv:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1