Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 简单的单字符数组加密需要人工长数组才能工作?_C_Arrays_Encryption - Fatal编程技术网

C 简单的单字符数组加密需要人工长数组才能工作?

C 简单的单字符数组加密需要人工长数组才能工作?,c,arrays,encryption,C,Arrays,Encryption,在单个char数组上运行简单加密。当数组大小小于或等于1时,它似乎不起作用,即使只有一个字符在变化 由于yesCrypto[10]被设置为10(或>1),因此下面的操作有效 以下选项不起作用,因为yesCrypto[0]设置为0,设置为1时也不起作用 char noCrypto[] = "H"; //sets an array to hold unencrypted H char yesCrypto[1]; //sets array to hold encrypted H

在单个
char
数组上运行简单加密。当数组大小小于或等于1时,它似乎不起作用,即使只有一个字符在变化

由于
yesCrypto[10]
被设置为
10
(或>1),因此下面的操作有效


以下选项不起作用,因为
yesCrypto[0]
设置为
0
,设置为
1
时也不起作用

char noCrypto[] = "H";    //sets an array to hold unencrypted H
char yesCrypto[1];        //sets array to hold encrypted H

yesCrypto[0]=noCrypto[0]+1;              
//takes 'H' from noCrypto and turns it into an 'I' and moves it into yesCrypto.

printf("Encrypted string is '%s'\n", yesCrypto);        
//prints 'IH'


附带问题:为什么在IH可能不工作时打印它。

在第一种情况下,您提供的数组(作为
%s
的参数)不是以null结尾的

char yesCrypto[10];
yesCrypto[0] = noCrypto[0]+1; 
printf("Encrypted string is '%s'\n", yesCrypto); // bad
引用
C11
,第§7.21.6.1章

s

如果不存在
l
长度修饰符,则参数应为指向初始值的指针 字符类型为.280)的数组的元素 写入(但不包括)终止空字符。如果 指定了精度,写入的字节数不超过该字节数如果 精度未规定或大于阵列尺寸时,阵列应 包含空字符。

在本例中,
yesCrypto
是一个自动本地数组,未初始化,内容是不确定的,因此不能保证数组中存在null。所以使用的原因

你在第二个案例中看到的也是

引用
C11
,第§6.7.6.2章

除了可选的类型限定符和关键字static之外,
[
]
还可以定义 表达式或
*
。如果它们分隔表达式(指定数组大小),则 表达式应为整数类型如果表达式是常量表达式,则应 具有大于零的值。[…]

因此,后面的代码(包含
char yesCrypto[0];
)有约束冲突,它调用UB


关于这可能而不是产生编译错误的原因的说明:

它支持zer长度数组,但用例非常具体,而且由于
C99
,“灵活数组成员”是此扩展的标准选择


最后,为了

…设置为1时也不起作用

将缺少空终止符的空间,从而引发与第一种情况相同的问题。简而言之,要使
char
数组的行为类似于包含
n
元素的字符串,您需要

  • 数组的大小为
    n+1
  • 索引
    n
    以包含空字符(
    '\0'

在第一种情况下,您提供的数组(作为
%s
的参数)不是以null结尾的

char yesCrypto[10];
yesCrypto[0] = noCrypto[0]+1; 
printf("Encrypted string is '%s'\n", yesCrypto); // bad
引用
C11
,第§7.21.6.1章

s

如果不存在
l
长度修饰符,则参数应为指向初始值的指针 字符类型为.280)的数组的元素 写入(但不包括)终止空字符。
如果 指定了精度,写入的字节数不超过该字节数如果 精度未规定或大于阵列尺寸时,阵列应 包含空字符。

在本例中,
yesCrypto
是一个自动本地数组,未初始化,内容是不确定的,因此不能保证数组中存在null。所以使用的原因

你在第二个案例中看到的也是

引用
C11
,第§6.7.6.2章

除了可选的类型限定符和关键字static之外,
[
]
还可以定义 表达式或
*
。如果它们分隔表达式(指定数组大小),则 表达式应为整数类型如果表达式是常量表达式,则应 具有大于零的值。[…]

因此,后面的代码(包含
char yesCrypto[0];
)有约束冲突,它调用UB


关于这可能而不是产生编译错误的原因的说明:

它支持zer长度数组,但用例非常具体,而且由于
C99
,“灵活数组成员”是此扩展的标准选择


最后,为了

…设置为1时也不起作用

将缺少空终止符的空间,从而引发与第一种情况相同的问题。简而言之,要使
char
数组的行为类似于包含
n
元素的字符串,您需要

  • 数组的大小为
    n+1
  • 索引
    n
    以包含空字符(
    '\0'

代码试图使用“%s”打印非字符串的字符数组

yesCrypto[]
不一定以空字符结尾

char yesCrypto[10];
yesCrypto[0] = noCrypto[0]+1; 
printf("Encrypted string is '%s'\n", yesCrypto); // bad
相反,请限制打印或附加空字符


OP的第二个代码很糟糕,因为长度为0的对象数组缺少定义的行为

// bad
char yesCrypto[0]; 

OP编辑的帖子使用了
char-yesCrypto[1]。在这种情况下,请使用

yesCrypto[0] = noCrypto[0]+1; 
printf("Encrypted string is '%.*s'\n", 1, yesCrypto);
// or 
printf("Encrypted character is '%c'\n", yesCrypto[0]);


基本上,将加密数据打印为字符串是一个问题,因为加密字符数组可能在许多地方包含空字符,而字符串需要空字符并以第一个字符结尾。

代码试图使用“%s”打印非字符串的字符数组

yesCrypto[]
不一定以空字符结尾

char yesCrypto[10];
yesCrypto[0] = noCrypto[0]+1; 
printf("Encrypted string is '%s'\n", yesCrypto); // bad
相反,请限制打印或附加空字符


OP的第二个代码很糟糕,因为长度为0的对象数组缺少定义的行为

// bad
char yesCrypto[0]; 

OP编辑的帖子使用了
char-yesCrypto[