Oddzielenie znaków spacjami w skopiowanym łańcuchu.

0

Witam.
Muszę napisać program który w nowo utworzonym pliku oddzieli znaki w łańcuchu spacjami np z Rok 2011 na R o k 2 0 1 1. Napisałem program ale działa zle wiec prosze o pomoc. Pozdrawiam

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    FILE *f1,*f2;
    char zn;
    int i=0;
    if((f1=fopen("plik.c","r"))==NULL)
{
    printf("Nie otwarto pliku\n");
    return 1;
}
    if((f2=fopen("spacja.c","w"))==NULL)
{
    printf("Nie maozna otworzyc 2 pliku\n");
    return 1;
}
    while((zn=getc(f1))!=EOF)
{
    if(i%2==1)
    fprintf(f2,"%c",32);

    else
    fprintf(f2,"%c",zn);

    i++;
}
system ("pause");   
return 0;
}
 

Ten program wpisuje do pliku "R k 2 1 " co zrobić żeby nie usuwał co 2 znaku ?

1

błędem jest to że robisz wstawianie spacji lub wstawianie znaku, a nie oba na raz gdy trzeba:

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    FILE *f1,*f2;
    char zn;
    bool wstaw_spacje = false;
    if((f1=fopen("plik.c","r"))==NULL)
{
    printf("Nie otwarto pliku\n");
    return 1;
}
    if((f2=fopen("spacja.c","w"))==NULL)
{
    printf("Nie mozna otworzyc 2 pliku\n");
    return 1;
}
    while((zn=getc(f1))!=EOF)
{
    if (wstaw_spacje)
    {
    fprintf(f2,"%c",32);
    }
     wstaw_spacje =~wstaw_spacje;
    fprintf(f2,"%c",zn);
   
}
 fclose(f1);
 fclose(f2);
 

system ("pause");   
return 0;
}
 
 
0

Dzięki wielkie za odpowiedz, a czy mógłbyś zdradzić co znaczą te linijki kodu?

bool wstaw_spacje = false;

  if (wstaw_spacje)
    {
    }
     wstaw_spacje =~wstaw_spacje; 
0

bool to zmienna typu logicznego posiada 2 stany 0 i 1 czyli prawdę (true) lub fałsz (false)

jeśli napiszę
**bool **wstaw_spacje = false;
ustawię tą zmienną na fałsz już przy jej deklaracji.

  if (wstaw_spacje)         // if (wstaw_spacje) odpowiada zapisowi     if (wstaw_spacje== true)
    {
    }
     wstaw_spacje =~wstaw_spacje;  // a tutaj negujemy wartość zmiennej, z true robimy false lub z false true.

operatorem negacji jest tutaj ~ zwraca on zmienną z zanegowanymi wszystkimi bitami.
w C każda wartość niezerowa jest prawdą natomiast 0 jest fałszem.

0

A da się to zrobić w jakiś inny bardziej zrozumiały sposób z tym samym efektem?

1

czemu niezrozumiałe :)
jak masz

int zmienna =2 to oznacza, że robisz coś takiego

int zmienna;
zmienna =2; tylko w 1 linijce. Podobnie z bool.

z kolei if(cokolwiek) oblicza wartość cokolwiek i jeśli ona nie jest zerem wyrażenie jest prawdziwe

z kolei zapis

x=~x; robi tak
-pobiera wartość zmiennej x
-neguje tą wartość
-zapisuje wartość pod tą samą zmienną :)
da sie inaczej tylko po co.

0

juz rozumiem:D wielkie dzieki:)

0

w sumie można to i tak bez niczego :D

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    FILE *f1,*f2;
    char zn;

    if((f1=fopen("plik.c","r"))==NULL)
{
    printf("Nie otwarto pliku\n");
    return 1;
}
    if((f2=fopen("spacja.c","w"))==NULL)
{
    printf("Nie mozna otworzyc 2 pliku\n");
    return 1;
}
    while((zn=getc(f1))!=EOF)
{
 
    fprintf(f2,"%c%c",zn,32);
}

 
 fclose(f1);
 fclose(f2);
 
 
system ("pause");   
return 0;
}
 
0

W sumie to nawet lepszy pomysł:D jeszcze raz dzieki;)

Mam jeszcze jedno małe pytanko:

                             if(zn=='['&&zn=='('&&zn=='{')
                             lewostronne++;
                             if(zn==']'&&zn==')'&&zn=='}')
                             prawostronne++;
                             
                              

Czemu ten warunek nie działa i musze wpisywać dla każdego znaku [{( osobnego ifa i potem sumować?
Jak zapisać to w jednym warunku? Z góry dzięki;)

1

if(zn=='['&&zn=='('&&zn=='{')
&& to jest logiczne ^ (koniunkcja) znak nie może być tym i tym i tym jednocześnie.
zmień na alternatywę ||

0

Dzieki:) Działa juz wszystko:)

0
Dawid123 napisał(a)

Witam.
Muszę napisać program który w nowo utworzonym pliku oddzieli znaki w łańcuchu spacjami np z Rok 2011 na R o k 2 0 1 1. Napisałem program ale działa zle wiec prosze o pomoc.

Skoro z "Rok 2011" masz zrobić "R o k 2 0 1 1", to Twój algorytm działa źle, gdyż rozdziela spacjami wszystkie znaki, łącznie ze... spacjami. Z przykładu wynika, że spacje masz ignorować przy rozdzielaniu.

0

Rozwiązanie alternatywne (bez obsługi błędów odczytu/zapisu):

#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>



int main(void) {
    int             fd_in, fd_out, wrc;
    char            str_out[2];
    struct stat     stat_in;
    ssize_t         bytes_read = 0;


    if ( (fd_in = open("file1.txt", O_RDONLY)) == -1 ) {
        perror("open(file1.txt)");
        return 1;
    };

    if ( fstat(fd_in, &stat_in) == -1 ) {
        perror("stat(file1.txt)");
        return 2;
    };

    if ( (fd_out = open("file2.txt", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) == -1 ) {
        perror("open(file2.txt)");
        close(fd_in);
        return 3;
    };

    str_out[1] = 32;
    while ( bytes_read < stat_in.st_size ) {
        bytes_read += read(fd_in, &str_out[0], 1);
        wrc = ((str_out[0] != 32) && (bytes_read < stat_in.st_size)) ? 2 : 1;
        write(fd_out, str_out, wrc);
    };

    close(fd_in);
    close(fd_out);
    return 0;
}
0
Piotrekdp napisał(a)

w sumie można to i tak bez niczego :D

    while((zn=getc(f1))!=EOF)
{
 
    fprintf(f2,"%c%c",zn,32);
}
 

To nie jest dobre rozwiązanie, gdyż w pliku wynikowym będzie zawsze lądowała nadmiarowa spacja na końcu.

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