数组输入按C中的一个索引关闭。凯撒块移位

时间:2018-10-21 09:19:38

标签: c arrays encryption multidimensional-array

这里有一些代码,它们从stdin中将字符流输入到数组中。然后将其转换为二维数组。然后,它将数组从行列顺序更改为列行顺序。然后,它会打印出新的数组,从而创建一个Caesar移位加密。我遇到的问题是我的数组开始使用第二个用户键入的字符将字符输入到数组中,我不确定为什么。

例如,如果我在控制台中键入“ 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 :(得分:0)

删除

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;

}

输出

Hleol

答案 1 :(得分:0)

忽略分配并检查alpha-ness,您可以这样做:

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个字节。

最后一部分可能还有更多;我没看得太近。