Ввод массива отключен на один индекс в C. Цезарь Блок Сдвиг - PullRequest
0 голосов
/ 21 октября 2018

Здесь у меня есть код, который вводит из stdin поток символов в массив.Затем он преобразует этот массив в двумерный массив.Затем он меняет этот массив с порядка столбцов строк на порядок строк столбцов.Затем он распечатывает новый массив, создавая шифрование Цезаря.Проблема, с которой я столкнулся, заключается в том, что мой массив начинает вводить символы в массив со вторым символом, введенным пользователем, и я не уверен, почему.

Например, если я набираю «Hello» в консоли, только"Ello" помещается в массив.

Есть мысли?Спасибо!

//
//  main.c
//  Caesar Block Cypher
//
//  Created by Jacob Byerline on 10/20/18.
//  Copyright © 2018 Jacob Byerline. All rights reserved.
//
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

int main(void){
//The size is extended by the input with the value of the provisional

char *str;
int inputChar;
int i, j;
size_t size = 0;
size_t len = 0;

printf("input string : ");
inputChar = getchar();

str = realloc(NULL, sizeof(char)*size);//size is start size
if(!str)return *str;

while(EOF!=(inputChar=fgetc(stdin)) && inputChar != '\n'){

    if(isalpha(inputChar)){

        str[len++]=inputChar;

        if(len==size){

            str = realloc(str, sizeof(char)*(size+=16));
            if(!str)return *str;
        }
    }

}
str[len++]='\0';

int squareOfLen = sqrt(len);
int twoDimensionalArraySize = squareOfLen + 1;

//printf("%lu \n", len);
//printf("%d \n", squareOfLen);
//printf("%d \n", twoDimensionalArraySize);

char twoDstr[twoDimensionalArraySize][twoDimensionalArraySize];
char FINALtwoDstr[twoDimensionalArraySize][twoDimensionalArraySize];

memcpy(twoDstr, str, twoDimensionalArraySize * 2 * sizeof(int));

for(i=0; i<twoDimensionalArraySize; i++){
    for(j=0; j<twoDimensionalArraySize; j++){
        printf("2D Array[%d][%d] = %c\n",i,j,twoDstr[i][j]);
    }
}

for(i=0; i<twoDimensionalArraySize; i++){
    for(j=0; j<twoDimensionalArraySize; j++){
        FINALtwoDstr[i][j] = twoDstr[j][i];
        //printf("2D Array[%d][%d] = %c\n",i,j,FINALtwoDstr[i][j]);
        printf("%c",FINALtwoDstr[i][j]);
    }
}

printf("\n");
return 0;

}

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Игнорируя распределение и проверяя альфа-ность, вы делаете это:

inputChar = getchar();                    // Read first char

while (EOF != (inputChar=fgetc(stdin))    // read further chars
    && inputChar != '\n') {
        str[len++]=inputChar;
}

Это означает, что первый символ потребляется, но никогда не сохраняется.Вместо этого вы можете сделать это:

inputChar = getchar();                    // Read first char

while (inputChar != EOF && inputChar != '\n') {
        str[len++]=inputChar;
        inputChar=fgetc(stdin)            // read further chars
}

Но есть и другие проблемы с вашим кодом:

  • Вы начинаете с выделения нулевых байтов, потому что size равно 0;
  • Вы должны выделить перед сохранением, в противном случае вы пишете за пределами буфера;
  • Когда вы добавляете нулевой терминатор, вы, вероятно, не должны увеличивать len, потому что '\0' не является частью локальной длины строки, даже если вам нужно выделить для нее место, что вы делаете не во всех случаях;
  • Квадрат len равен len * len, а не sqrt(len): Это квадратный корень;
  • Вы квадратируете размерность дважды: если len равен 3, вам нужен массив 3 × 3, но вы пытаетесь выделить массив 9 × 9 в стеке;
  • Вы не можете скопировать len*len * 2 * sizeof(int) байтов из str, который имеет только len байтов.

Возможно, в последней части есть еще кое-что;Я не слишком внимательно посмотрел.

0 голосов
/ 21 октября 2018

Удалить

inputChar = getchar();

Это занимает 'H' из вашего входного потока.

Смотрите здесь https://ideone.com/ZwT9Iq

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

int main(void){
//The size is extended by the input with the value of the provisional

char *str;
int inputChar;
int i, j;
size_t size = 0;
size_t len = 0;

printf("input string : ");
//inputChar = getchar();

str = realloc(NULL, sizeof(char)*size);//size is start size
if(!str)return *str;

while(EOF!=(inputChar=fgetc(stdin)) && inputChar != '\n'){

    if(isalpha(inputChar)){

        str[len++]=inputChar;

        if(len==size){

            str = realloc(str, sizeof(char)*(size+=16));
            if(!str)return *str;
        }
        printf("%c", inputChar);

    }

}
 printf("\n");
str[len]='\0';

int squareOfLen = sqrt(len);
int twoDimensionalArraySize = squareOfLen + 1;

//printf("%lu \n", len);
//printf("%d \n", squareOfLen);
//printf("%d \n", twoDimensionalArraySize);

char twoDstr[twoDimensionalArraySize][twoDimensionalArraySize];
char FINALtwoDstr[twoDimensionalArraySize][twoDimensionalArraySize];

memcpy(twoDstr, str, twoDimensionalArraySize * 2 * sizeof(int));

for(i=0; i<twoDimensionalArraySize; i++){
    for(j=0; j<twoDimensionalArraySize; j++){
        printf("2D Array[%d][%d] = %c\n",i,j,twoDstr[i][j]);
    }
}

for(i=0; i<twoDimensionalArraySize; i++){
    for(j=0; j<twoDimensionalArraySize; j++){
        FINALtwoDstr[i][j] = twoDstr[j][i];
        //printf("2D Array[%d][%d] = %c\n",i,j,FINALtwoDstr[i][j]);
        printf("%c",FINALtwoDstr[i][j]);
    }
}

printf("\n");
return 0;

}

output

Hleol
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...