Prosty program do zamiany znaków

0

Zadanie:
wczytaj łańcuch i dwa znaki, jeśli w tekście pojawi się pierwszy znak - podwoić go, jeśli drugi - zamienić na spację

Kod:

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

int main(){
    int dlugosc,a;
    char slowo[1000], znak_1[100], znak_2[200], slowo_2[1000];

    printf("Wpisz slowo\n");
    scanf("%s", &slowo);
    dlugosc=strlen(slowo);

    printf("Wpisz 1 znak\n");
    scanf("%s", &znak_1);

    printf("Wpisz 2 znak\n");
    scanf("%s", &znak_2);


    a=0;
    for(a=0;a<dlugosc;a++){
        if(slowo[a]==znak_1){
            slowo_2[a]=znak_1;
            a++;
            dlugosc++;
            slowo_2[a]=znak_1;
        }else{
            if(slowo[a]==znak_2){
                slowo_2[a]=' ';
            }
            slowo_2[a]=slowo[a];
        }
    };

    printf("%s", slowo_2);


    getch();
    return 0;
}

Wynik:
Krzaki

Czy ktoś może mnie oświecić?
Ja to robie na podstawie stworzenia drugiej zmiennej char i dopisywania znaków.

1
    char slowo[1000], znak_1, znak_2;
    printf("Wpisz slowo i dwa znaki\n");
    scanf(" %999[^\n]s %c %c%*[^\n]s%*c", slowo, &znak_1, &znak_2);
2

Ten kod to bzdura.

  1. Jeśli masz wczytać dwa znaki, to dlaczego wczytujesz stringi?
  2. slowo[a]==znak_1 porównujesz char z char* - kompilator o to powinien strasznie płakać
  3. poniższe nie ma sensu, zawsze nadpisujesz obecnym znakiem (pomijając już błędne porównanie)
        }else{
            if(slowo[a]==znak_2){
                slowo_2[a]=' ';
            }
            slowo_2[a]=slowo[a];
        }
  1. nigdzie nie wpisujesz '\0' na końcu slowo_2 - nic dziwnego, że printf wariuje (UB)
  2. do slowo wczytujesz slowo, w warunkach zadania jest "łańcuch". Ograniczenie do pojedynczego słowa może być niezgodne z wymaganiami.
0
#include <stdio.h>
#include <string.h>

int main(){
    int dlugosc,a;
    char slowo[1000], znak_1, znak_2, slowo_2[1000];

    printf("Wpisz slowo i 2 znaki\n");
    scanf("%999s %c %c", &slowo, &znak_1, &znak_2);

    dlugosc=strlen(slowo);

    a=0;
    for(a=0;a<dlugosc;a++){
        if(slowo[a]==znak_1[0]){
            ZAMIEN SLOWO[a] NA ZNAK_1 * 2
            a++; dlugosc++;
        }else{
            if(slowo[a]==znak_2[0]){
                ZAMIEN SLOWO[a] NA ZNAK_2
            }
        }
    };

    printf("%s", slowo);


    getch();
    return 0;
}
 

Czy to jest logiczne? Jeżeli tak to w jaki sposób dokonać zamiany znaków?

1

Ponieważ tablica slowo_2 może być dłuższe niż slowo to indeksacja tych tablic jednym indeksem jest ewidentnym błędem.

#include <stdio.h>

int main()
  {
   int i,k;
   char line[1000],result[2000],chduplicate,chspace;

   printf("Wpisz napis: ");
   scanf("%999[^\n]s%*c",line);
   printf("Wpisz 2 znaki: ");
   scanf(" %c %c%*[^\n]s%*c",&chduplicate,&chspace);
   for(i=k=0;line[i];++i)
     {
      if(line[i]==chduplicate)
        {
         result[k++]=chduplicate;
         result[k++]=chduplicate;
        }
      else if(line[i]==chspace) result[k++]=' ';
      else result[k++]=line[i];
     }
   result[k]=0;
   printf("%s\n",result);
   return 0;
  }

http://ideone.com/yC6GTj

Ewentualnie:

#include <stdio.h>

int main()
  {
   int i,k;
   char line[1000],result[2000],chduplicate,chspace,ch;

   printf("Wpisz napis: ");
   scanf("%999[^\n]s%*c",line);
   printf("Wpisz 2 znaki: ");
   scanf(" %c %c%*[^\n]s%*c",&chduplicate,&chspace);
   for(i=k=0;(ch=line[i])!=0;++i,result[k++]=ch) if(ch==chduplicate) result[k++]=ch; else if(line[i]==chspace) ch=' ';
   result[k]=0;
   printf("%s\n",result);
   return 0;
  }

http://ideone.com/7XKrLk

0

%999[^\n]s%*c <-- co to oznacza?
%c %c%*[^\n]s%*c <-- co to oznacza?

for(i=k=0;line[i];++i)

Czyli pętla ma się wykonywać dopóki skończą się znaki w line?

  1. Dlaczego na końcu jest result[k]=0;?

`dodanie znaczników i ``` - @furious programming

1
  1. http://en.cppreference.com/w/c/io/fscanf
  2. Dopóki line[i] != 0
  3. Żeby wiadomo było kiedy należy przestać wyświetlać znaki w stringu.
3

Nie potrafie ogarnąć 1)... Skąd się bierze to %999 ... ; /

Szukaj królika
46f8d07ab0.png

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