Jump to content
Sign in to follow this  
Mirage_Angel

Command Line Argument

Recommended Posts

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

#define XMAX 65
#define YMAX 32

char screen[XMAX][YMAX];

void printScreen(void);
void fill(int, int, char);
void isi(int, int, char);

int main(int argc, char *argv[])
{ FILE *in;
  int x, y, m, n;
  char a;

  if (argc!= 5)
  { fprintf(stderr,"Usage:\n\t%s <65x32 text file> <x> <y> <letter>\n",argv[0]);
    exit(1);
  }

  in = fopen(argv[1],"r");
  if (in == NULL)
  { perror("opening input file");
    exit(1);
  }

  for (y=0; y<YMAX; y++)
  { for (x=0; x<XMAX; x++)
      screen[x][y] = fgetc(in);
  }
  if (fclose(in))
  { perror("closing input file");
    exit(1);
  }

  printScreen();
  x = atoi(argv[2]);
  y = atoi(argv[3]);
  a = argv[4][0];
   

  fill(x,y,a);

  printScreen();
}

void printScreen(void)
{ int x,y;
  
  for (y=0; y<YMAX; y++)
      for (x=0; x<XMAX; x++)
          if(screen[x][y]!= EOF)
              putchar(screen[x][y]);
          else
              puts("\n");
         
}

void fill(int x, int y, char a)
{
  if ((screen[x][y] != ' '))
    return;

  screen[x][y] = a;
  fill(x,y+1,a);
  fill(x,y-1,a);
  fill(x+1,y,a);
  fill(x-1,y,a);
}

Code kat atas ni fungsi dia macam paint bucket dalam paint. Problem dia sekarang macam mana saya nak buat kita leh print whole string dalam argv[4]. Kalau yang kat atas tu argv[4][0] akan print first character untuk string dalam argv[4]. Macam mana nk buat bg kita leh print whole string dalam argv[4]. Ok. Terima kasih

Share this post


Link to post
Share on other sites

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

#define XMAX 65
#define YMAX 32

char screen[XMAX][YMAX];

void printScreen(void);
void fill(int, int, char);
void isi(int, int, char);

int main(int argc, char *argv[])
{ FILE *in;
  int x, y, m, n;
  char a;

  if (argc!= 5)
  { fprintf(stderr,"Usage:\n\t%s <65x32 text file> <x> <y> <letter>\n",argv[0]);
    exit(1);
  }

  in = fopen(argv[1],"r");
  if (in == NULL)
  { perror("opening input file");
    exit(1);
  }

  for (y=0; y<YMAX; y++)
  { for (x=0; x<XMAX; x++)
      screen[x][y] = fgetc(in);
  }
  if (fclose(in))
  { perror("closing input file");
    exit(1);
  }

  printScreen();
  x = atoi(argv[2]);
  y = atoi(argv[3]);
  a = argv[4][0];
   

  fill(x,y,a);

  printScreen();
}

void printScreen(void)
{ int x,y;
  
  for (y=0; y<YMAX; y++)
      for (x=0; x<XMAX; x++)
          if(screen[x][y]!= EOF)
              putchar(screen[x][y]);
          else
              puts("\n");
         
}

void fill(int x, int y, char a)
{
  if ((screen[x][y] != ' '))
    return;

  screen[x][y] = a;
  fill(x,y+1,a);
  fill(x,y-1,a);
  fill(x+1,y,a);
  fill(x-1,y,a);
}

Code kat atas ni fungsi dia macam paint bucket dalam paint. Problem dia sekarang macam mana saya nak buat kita leh print whole string dalam argv[4]. Kalau yang kat atas tu argv[4][0] akan print first character untuk string dalam argv[4]. Macam mana nk buat bg kita leh print whole string dalam argv[4]. Ok. Terima kasih

Tak yah boh [0], pakai argv[4] je, contoh:

printf("%s", argv[4]);

kalu nak boh gak kena pakai &, contoh:

printf("%s", &argv[4][0]);

baik tak payah boh laa... lagi mudah.

Edited by CFoo++

Share this post


Link to post
Share on other sites

Tak yah boh [0], pakai argv[4] je, contoh:

printf("%s", argv[4]);

kalu nak boh gak kena pakai &, contoh:

printf("%s", &argv[4][0]);

baik tak payah boh laa... lagi mudah.

masalahnya kat sini x guna printf. screen[x][y] berfungsi sebagai printf. Yang ni recursion. Jadi terpaksa assign char kepada pointer. bila cuba char *a = argv[4], boleh tapi still print first character dalam string argv[4].

ni contoh output dier . output ni kalau kita pilih I untuk argv[4].

outputbangangoj9.jpg

Edited by Mirage_Angel

Share this post


Link to post
Share on other sites

Aku tak biasa ngan program console ni, cume boleh cite cam ni...

argv[4] adalah pointer ke string yang dimasukkan sebagai command line argument yang ke 5. Biasanya 0 terminated string.

argv[4][0] adalah karakter pertama, argv[4][1] karakter kedua dan seterusnya.

Jika argv[4][n] == 0, maknanya itu dah penghujung string tersebut (terminator).

Lebih kurang cam tu lah, harap dpt membantu.

Edited by CFoo++

Share this post


Link to post
Share on other sites
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define XMAX 65
#define YMAX 32

char screen[XMAX][YMAX];

void printScreen(void);
void fill(int, int, char*, int);

int main(int argc, char *argv[])
{ FILE *in;
  int x, y;
  char* a;
  int ArraySize;

  if (argc!= 5)
  { fprintf(stderr,"Usage:\n\t%s <65x32 text file> <x> <y> <letter>\n",argv[0]);
    exit(1);
  }

  in = fopen(argv[1],"r");
  if (in == NULL)
  { perror("opening input file");
    exit(1);
  }

  for (y=0; y<YMAX; y++)
  { for (x=0; x<XMAX; x++)
      screen[x][y] = fgetc(in);
  }
  if (fclose(in))
  { perror("closing input file");
    exit(1);
  }

  printScreen();

  x = atoi(argv[2]);
  y = atoi(argv[3]);
  a = argv[4];

  ArraySize = 0;
  while (a[ArraySize] ^ 0) ArraySize++;
  fill(x,y,a, ArraySize);
  printScreen();
}

void printScreen (void)
{ int x,y;
  
  for (y=0; y<YMAX; y++)
      for (x=0; x<XMAX; x++)
          if(screen[x][y]!= EOF)
              putchar(screen[x][y]);
          else
              puts("\n");         
}

void fill(int x, int y, char* a, int i)
{
  if (screen[x][y] != ' ')
    return;

  screen[x][y] = *a;

  /* ko adjust la sendiri cmne ko nk layout die... */
  fill(x+1,y,a++,i);
  if (*a == 0) a-=i;
  fill(x-1,y,a,i);

  fill(x,y+1,a,i);
  fill(x,y-1,a,i);
}

Share this post


Link to post
Share on other sites

Terima kasih banyak banyak Stranger. Power la ko. Arigato Gozaimasu. Setelah sekian lama mencari jawapan akhirnya dapat gak. Sebenarnya ni soalan tuto aku. Tuto tu suruh leh wat print je tapi aku saja ja nak tambah ilmu lebih nak buat advance sket leh print string. Oo camtu rupanya. Terima kasih yer.

Stranger,

Leh terang sket x ape fungsi code ni

  ArraySize = 0;
  while (a[ArraySize] ^ 0) 
      ArraySize++;
kenape mesti kuasa 0? bukanke semua nombor kalau kuasa kosong akan jadi 1. Maknenyer true. kenaper perlu condition ni dan ni
       if (*a == 0)
      a-=i;

Ape fungsi code di atas ni?

Ok. Thanks

Edited by Mirage_Angel

Share this post


Link to post
Share on other sites

Sbl tu, ko bce ni utk phmkn konsep array & pointer dlu...

  ArraySize = 0;
  while (a[ArraySize] ^ 0) 
      ArraySize++;
Ni smnenya utk check String Length, aku lupe ade function strlen() Aku pki XOR(^) sbb die lg pantas dr gune NOT EQUAL TO(!=)
fill(x+1,y,a++,i);
Yg ni (a++) aku advancekan pointer ke char seterusnya dlm array tu, cth, klu ko passed "12345" sbg command line die, next char should be '2' la kan...
if (*a == 0) a-=i;

ni kte validate string tu since string is terminated by a null char (char code 0) & reset ke position asal (memory location utk '1') sebab kte dh advancekan pointer tu during each time die call function fill()...

klu x letak ni pn bleh gk, tp akan keluar char yg mengarut sbg output die.

sbbnye, string yg sepatutnye ade "12345", akan jd lain coz kte dah akses memory location yg xsepatutnye kte akses (memory location selain drpd memory location utk string "12345") & lebih truk g mungkin akan dpt error klu memory location tu invalid...

Share this post


Link to post
Share on other sites

Yang mengenai strlen tu selalunya aku guna bersama ngan fgets. sepatutnya macam ni kan

a[strlen(a)-1] == 'slash 0'
tp aku try sekali ngan bitwise operator tu x leh pun.
while(a[strlen(arraySize)-1] ^ 0)
 arraySize++;
null character bukan ke 'slash 0' . Selalunya kalau string contohnya "ABC" bukan ke dianyer location "A,B,C," kenapa kita guna comparison
if(*a == 0)
 a-=i;
kenaper bukan
if(*a == 'slash 0')
  a-=i;
dan
a-=i

a = a - i; jadi kalau a = 0 dan i = 0, jadi total a = 0 - 0 = 0 kan. kalau i = 1 akan jadi -1. Jadi ape tujuan sebenarnya.

Lagi satu output yang aku dapat terbalik. Aku cuba nak try edit layout ikut kehendak aku, tp still confuse. naper yang check condition kalau null character hanya selepas koordinat x,y+1. Naper kita hanya leh buat condition a++ untuk function call x,y+1. untuk yang lagi 3 x leh plak. Dia akan keluar output yang gile2. Ok. Thanks

Edited by Mirage_Angel

Share this post


Link to post
Share on other sites

strlen()

ArraySize = strlen (a);
aku directly assign character code: sepatutnye ade cast sbl character code, tp aku mls nk wt coz VC++ x issue warning or error, compiler len mungkin kot...
if(*a == (char)0)
a-=i;
yg /0 tu pun bleh gk, tp ne wt cmni
if(*a == '/0')
a-=i;
ko dh bce & phmkn lom link yg aku bg tu? tujuan sebenar die utk navigate between memory location
a-=i;
a = memory location *a = value yg contain kt variable tu so a x akan jd 0 coz die memory location, klu *a tu akn jd 0 coz die contain value Ni example...
#include <stdio.h>

void main()
{
    char  String[]       = "12345";
    char* MemoryLocation = NULL;

    MemoryLocation = String;

    printf ("Memory Location for the first string occurence = 0x%x \n", MemoryLocation);
    printf ("Value = `%c' \n\n", *MemoryLocation);

    MemoryLocation++;
    printf ("Memory Location for the second string occurence = 0x%x \n", MemoryLocation);
    printf ("Value = `%c' \n\n", *MemoryLocation);

    MemoryLocation++;
    printf ("Memory Location for the third string occurence = 0x%x \n", MemoryLocation);
    printf ("Value = `%c' \n\n", *MemoryLocation);

    MemoryLocation++;
    printf ("Memory Location for the fourth string occurence = 0x%x \n", MemoryLocation);
    printf ("Value = `%c' \n\n", *MemoryLocation);

    MemoryLocation++;
    printf ("Memory Location for the fifth string occurence = 0x%x \n", MemoryLocation);
    printf ("Value = `%c' \n\n", *MemoryLocation);
}
i plak x akan jd 0 gk coz program ko ni require 5 argumnents i jugak x akan berubah value die, tu kan string length???
if (argc!= 5)
  { fprintf(stderr,"Usage:\n\t%s <65x32 text file> <x> <y> <letter>\n",argv[0]);
    exit(1);
  }

yg psl layout 2 aku pn pening ckit :wacko:, nnt ade mase aku tgk blk...

Edited by Stranger

Share this post


Link to post
Share on other sites

Aduh susahnya nak masuk website putera.com ni.

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

#define XMAX 65
#define YMAX 32

char screen[XMAX][YMAX];

void printScreen(void);
void fill(int, int, char*, int);

int main(int argc, char *argv[])
{ FILE *in;
  int x, y;
  char *a;
  int ArraySize;

  if (argc!= 5)
  { fprintf(stderr,"Usage:\n\t%s <65x32 text file> <x> <y> <sentences>\n",argv[0]);
    exit(1);
  }

  in = fopen(argv[1],"r");
  if (in == NULL)
  { perror("opening input file");
    exit(1);
  }

  for (y=0; y<YMAX; y++)
  { for (x=0; x<XMAX; x++)
      screen[x][y] = fgetc(in);
  }
  if (fclose(in))
  { perror("closing input file");
    exit(1);
  }


  x = atoi(argv[2]);
  y = atoi(argv[3]);
  a = argv[4];

  ArraySize = strlen(a);
  while (a[ArraySize] != 0) 
      ArraySize++;
  fill(x,y,a,ArraySize);
  printScreen();
}

void printScreen (void)
{ int x,y;
  
  for (y=0; y<YMAX; y++)
      for (x=0; x<XMAX; x++)
          if(screen[x][y]!= EOF)
              putchar(screen[x][y]);
           else        
              puts("\n");         
}

void fill(int x, int y, char *a, int i)
{
  if (screen[x][y] != ' ')
    return;
    
  screen[x][y] = *a;

  if((x < 0)||(x>65)||(y<0)||(y>32))
      return;

  a++;
  if(*a == '')
     a-=i;
  
  fill(x+1,y,a,i);
  fill(x,y+1,a,i);
  fill(x,y-1,a,i);
  fill(x-1,y,a,i);/*kalau buang yang ni dia print ke kanan atas bawah ok. Kalau ada dia campur aduk*/
}

Ni code yang aku dah ubah suai. Bila print ke kanan, bawah dan atas ok tapi bila ke kiri dia ada problem. Ader idea x camna nak fix problem ni.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...