Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

About Rot13-Implementation

Tags:

c

rot13

I am trying to implement the rot13-algorithm in C. But since I am not very familiar with that language, I have some problems with my code right here.

Basically, I want to rotate every letter in args[] to 13 positions up. But this code seems to be pretty sluggish:

#include <stdio.h>

char[] rotate(char c[]) {
  char single;
  int i;
  int alen = sizeof(c)/sizeof(c[0]);
  char out[alen];

  for(i=0;i<=alen;i+=1) {
    if(c[i]>='a' && (c[i]+13)<='z'){
      out[i] = c[i]+13;
    }
  }

  return out;
}

int main(int argc, char *argv[]) {
  printf("The given args will be rotated\n");
  int i;
  char rotated[sizeof(argv)/sizeof(argv[0])];

  rotated = rotate(argv);

  /* printing rotated[] later on */
  return 0;

}

I know there a lot of holes here - could you show me how to fix this?

like image 829
QKL Avatar asked Apr 10 '26 04:04

QKL


2 Answers

Thanks a lot guys, I solved the problem with this code

#include <stdio.h>

int rot13(int c){
  if('a' <= c && c <= 'z'){
    return rot13b(c,'a');
  } else if ('A' <= c && c <= 'Z') {
    return rot13b(c, 'A');
  } else {
    return c;
  }
}

int rot13b(int c, int basis){
  c = (((c-basis)+13)%26)+basis;
  return c;
}

int main() {
  printf("The given args will be rotated");
  int c;
  while((c = getchar()) != EOF){
    c = rot13(c);
    putchar(c);
  }
  return 0;
}
like image 176
QKL Avatar answered Apr 12 '26 20:04

QKL


How @Michael said this char out[alen] is not accepted by the compiler because you can't declare an array size with a non constant value. Another problem of your code is the for loop for( i = 0; i < = alen; i+=1 ) the arrays start on 0 so if you do the for until the lenght's position you will be out of the array.

About the code:

  1. You must use a pointer to the start of the string as argument of the function, because You can't return arrays in C (But you can return pointers ).
  2. Your if( str[i] >= 'a' && (str[i]+13) <='z') is incorrect because you will convert some letters into symbols take a look.

________enter image description here --------------------------ASCII CODE!

    void rotate( char * str ) 
    {
        int i = 0;

        /* You do this until you find a '\0' */
        for( i = 0; str[ i ] != '\0' ; i++ ){

            /* Use the pointer notation if you passed a pointer. */
            /* If the letter is between a and m you can simply  sum it. */
            if( *( str + i ) >= 'a' && *( str + i ) < 'n')
                *( str + i ) += 13;       

            /* If the letter is between the n and z you have to do the opposite.*/
            else if( *( str + i ) >= 'n' && *( str + i ) <= 'z')
                *( str + i ) -= 13;
        }
    }
like image 37
Alberto Bonsanto Avatar answered Apr 12 '26 20:04

Alberto Bonsanto



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!