lodam
lodam

Reputation: 77

C Program file-io user input

This program takes a a file name which contains a particular sentence and shifts by a certain amount.

if I have Hello and shift by 22 it should be Dahhk, This worked properly when I didn't enter the file name and had the file name in the program manually like

ifp = fopen( "input.txt", "r" );

However when I have the user enter the file name and the input is Hello and shift by 22 the output becomes D{‚‚…

ifp = fopen( name, "r" );

I tried using scanf("%s", name);

and I tried using fgets(name, sizeof(name), stdin);

both produce the same results

I am not sure how to fix this issue.

#include <stdio.h>

#define MAX_LEN 100

void decode( char *sentence, int shift );

int main( void )
{
  FILE *ifp;
  FILE *ofp;

  char str[MAX_LEN];
  int shift_by = 0;
  char name[100];

  printf("Program name: \n");
  scanf("%s", name);
  printf( "Please enter shift by and press enter\n" );
  scanf( " %d", &shift_by );

  ifp = fopen( name, "r" );
  ofp = fopen( "output.txt", "w" );

  if ( ifp == NULL )
  {
    printf( "FILE doesnt open" );
    return 1;
  }

  while ( fgets( str, MAX_LEN, ifp ) != NULL )
  {
    decode( str, shift_by );
    fprintf( ofp, " %s", str );
  }

  fclose( ifp );
  fclose( ofp );
  return 0;
}

void decode( char *sentence, int shift )
{
  int i = 0;
  char p;

  while ( p = sentence[i] )
  {
    if ( ( p >= 'a' ) && ( p <= 'z' ) )
    {
      p = ( p - 'a' ) + shift % 26 + 'a';
    }

    if ( ( p >= 'A' ) && ( p <= 'Z' ) )
    {
      p = ( p - 'A' + shift ) % 26 + 'A';
    }

    sentence[i] = p;
    i++;
  }

}

Upvotes: 1

Views: 71

Answers (1)

chux
chux

Reputation: 154272

OP's code has a small error:

// p = ( p - 'a' ) + shift % 26 + 'a';
p = ( p - 'a' + shift) % 26 + 'a';

Curiously OP coded correctly with

p = ( p - 'A' + shift ) % 26 + 'A';

The hint was "Hello" --> "D{‚‚…" worked for uppercase, yet not lowercase.

Upvotes: 1

Related Questions