正确填充空C字符串
Fill empty C string correctly
我正在尝试实施 "hebrew encryption",其工作方式如下:
- 输入列数和行数
- 输入要加密的文本
- 用文本填充数组
- 先输出文本列
示例:
- 5 乘 4:"This is an example.."
This
is an
exam
ple..
- 输出:"Ti phseli xesaa. nm."
但是,我遇到了比数组空间短的文本问题:
- 5 乘 4:"This is an"
This
is an
????
在哪里“?”是随机(?)字符。
我的猜测是,我没有正确格式化字符串。目前我检查一个字符是 '\n' 还是 '\0' 并将其替换为空格。
感谢任何帮助。
我的代码如下所示:
#include <stdio.h>
#include <string.h>
int main(void){
int x, y;
printf("Please input rows and collumns: \n");
scanf("%d", &x);
scanf("%d", &y);
char string[x*y];
printf("Please insert text: \n");
fgets(string, x*y, stdin); //ignore \n from previous scanf (otherwise terminates
fgets(string, x*y, stdin); //immediatly as \n is still there)
int k = 0;
char code[y][x];
for(int i=0; i < x*y; i++){
if(string[i] == '\n' || string[i] == '[=2=]')
string[i] = ' ';
}
for(int i=0; i < y; i++){
for(int j=0; j < x; j++){
code[i][j] = string[k];
k++;
}
}
//output of matrix
for(int i=0; i < y; i++){
for(int j=0; j < x; j++){
printf("%c ",code[i][j]);
}
printf("\n");
}
//matrix to message
k = 0;
char message[128];
for(int j=0; j < x; j++){
for(int i=0; i < y; i++){
message[k] = code[i][j];
k++;
}
}
printf("%s \n", message);
return 0;
}
nul 填充字符串
然后wen读出结果skip the nuls
char string[x*y+1]; // you had it too small
...
fgets(string, x*y+1, stdin); //immediatly as \n is still there)
int num_read = strlen(string);
if(num_read < x*y+1 )
memset(string+num_read,'[=10=]',x*y+1-num_read);
if (string[num_read ] == '\n' )
string[num_read ] = '[=10=]';
...
char message[x*y+1]; // was way too small!
for(int j=0; j < x; j++){
for(int i=0; i < y; i++){
if(code[i][j])
message[k] = code[i][j];
k++;
}
}
message[k]='[=11=]'
你有两个问题
你需要初始化string
变量中的所有字节,而不是用for
循环,你可以在fgets
memset(string, ' ', x * y);
所以现在字符串中的所有字节都是 spaces 然后你可以删除尾随 '\n'
并用 space 更改终止 '[=17=]'
,在 fgets
和
size_t length;
length = strlen(string);
if (string[length - 1] == '\n')
string[length - 1] = ' ';
string[length] = ' ';
您需要向 message
变量添加终止符 '[=17=]'
,在您填充 message
的循环中,您在 message[k] = '[=22=]';
之后附加 message[k] = '[=22=]';
循环终止
k = 0;
char message[128];
for(int j=0; j < x; j++){
for(int i=0; i < y; i++){
message[k] = code[i][j];
k++;
}
}
message[k] = '[=12=]';
我正在尝试实施 "hebrew encryption",其工作方式如下:
- 输入列数和行数
- 输入要加密的文本
- 用文本填充数组
- 先输出文本列
示例:
- 5 乘 4:"This is an example.."
This is an exam ple..
- 输出:"Ti phseli xesaa. nm."
但是,我遇到了比数组空间短的文本问题:
- 5 乘 4:"This is an"
This is an ????
在哪里“?”是随机(?)字符。
我的猜测是,我没有正确格式化字符串。目前我检查一个字符是 '\n' 还是 '\0' 并将其替换为空格。
感谢任何帮助。
我的代码如下所示:
#include <stdio.h>
#include <string.h>
int main(void){
int x, y;
printf("Please input rows and collumns: \n");
scanf("%d", &x);
scanf("%d", &y);
char string[x*y];
printf("Please insert text: \n");
fgets(string, x*y, stdin); //ignore \n from previous scanf (otherwise terminates
fgets(string, x*y, stdin); //immediatly as \n is still there)
int k = 0;
char code[y][x];
for(int i=0; i < x*y; i++){
if(string[i] == '\n' || string[i] == '[=2=]')
string[i] = ' ';
}
for(int i=0; i < y; i++){
for(int j=0; j < x; j++){
code[i][j] = string[k];
k++;
}
}
//output of matrix
for(int i=0; i < y; i++){
for(int j=0; j < x; j++){
printf("%c ",code[i][j]);
}
printf("\n");
}
//matrix to message
k = 0;
char message[128];
for(int j=0; j < x; j++){
for(int i=0; i < y; i++){
message[k] = code[i][j];
k++;
}
}
printf("%s \n", message);
return 0;
}
nul 填充字符串 然后wen读出结果skip the nuls
char string[x*y+1]; // you had it too small
...
fgets(string, x*y+1, stdin); //immediatly as \n is still there)
int num_read = strlen(string);
if(num_read < x*y+1 )
memset(string+num_read,'[=10=]',x*y+1-num_read);
if (string[num_read ] == '\n' )
string[num_read ] = '[=10=]';
...
char message[x*y+1]; // was way too small!
for(int j=0; j < x; j++){
for(int i=0; i < y; i++){
if(code[i][j])
message[k] = code[i][j];
k++;
}
}
message[k]='[=11=]'
你有两个问题
你需要初始化
string
变量中的所有字节,而不是用for
循环,你可以在fgets
memset(string, ' ', x * y);
所以现在字符串中的所有字节都是 spaces 然后你可以删除尾随
'\n'
并用 space 更改终止'[=17=]'
,在fgets
和size_t length; length = strlen(string); if (string[length - 1] == '\n') string[length - 1] = ' '; string[length] = ' ';
您需要向
message
变量添加终止符'[=17=]'
,在您填充message
的循环中,您在message[k] = '[=22=]';
之后附加message[k] = '[=22=]';
循环终止k = 0; char message[128]; for(int j=0; j < x; j++){ for(int i=0; i < y; i++){ message[k] = code[i][j]; k++; } } message[k] = '[=12=]';