这里有一些代码,它们从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;
}
答案 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
,而不是sqrt(len)
:这是平方根; len
为3,则需要3×3的数组,但是尝试在堆栈上分配9×9的数组; len*len * 2 * sizeof(int)
个字节中复制str
个字节,len
个字节。最后一部分可能还有更多;我没看得太近。