我有以下两种格式的字母数组:
const char plain[26] = {'a','b',....'y','z'} // this is the the full alphabet
const char crypt[26] = {'i','d',....'m','x'}; // this is the the alphabet scrambled
两个数组中字母的顺序可以根据输入而变化。这种变化发生在主要功能上。
这样做的目的是将字符串的字母与第二个字母匹配,就像加密一样。我将字符与数组值进行比较。所以看起来像这样(简化)
text[3] = 'yes';
changed[3];
if(text[0] == plain[25]){ //would be done under a for loop so 25 would be a changing integer value
changed[0] = [crypt[25];
}
我的代码在main函数下可以完美运行。我想提到我的目的是因为我以前遇到的问题仅仅是由于数组和格式的类型。而且由于阵列已移到外面,我可能会再次遇到这些问题。
现在,我想使数组成为全局数组。实际的加密发生在不将数组作为变量的函数中。但是我希望该功能可以访问它们。
这就是现在的样子
const char plain[26];
const char crypt[26];
int maint(void){
const char plain[26] = {'a','b',....'y','z'} \\values get changed here
const char crypt[26] = {'i','d',....'m','x'} \\and here
虽然这没有错误,但是我没有得到输出,我相信其他函数使用的是空白数组而不是更改后的数组(如果更改甚至可以完成的话)。
我尝试了不同的数组类型,我认为问题在于初始化或提供数组值。
编辑:为清楚起见,两个数组可以按任何顺序排列。文本文件将以以下格式随机分配给我订单:
b,r
m,o
l,s
...
...
...
两种情况下,字母都是随机的。第一列对应于第一个数组(纯),第二列对应于第二个数组(crypt)。
如果有一种按列读取并以格式存储的方法
plain = 'bml...'; \\whole alphabet randomized
crypt = 'ros...'; \\whole alphabet randomized
那也行。
答案 0 :(得分:11)
您在plain
中拥有的crypt
和main
与全局变量不同。由于您再次声明了它们,因此它们是新的,仅在main
中可见。因此,您无需更改全局变量。
相反,仅全局声明一次,并在main
函数中进行赋值:
char plain[26];
int main(void) {
memcpy(plain, "abcdefghijklmnopqrstuvwxyz", 26); //values get changed here
return 0; // indicate successful program execution
}
还请注意,其中存在一些语法错误
const char plain[26] = {'a','b',....'y','z'} \\values get changed here
注释以//
开头,而不是\\
,声明后需要;
。另外,int main
应该在C中返回一个int
。
当然,如果您不需要实际更改内存并将其分配给预定义的字符集,则可以这样操作:
const char *plain;
int main(void) {
plain = "abcdefghijklmnopqrstuvwxyz";
return 0;
}
通过这种方式,您仍然可以使用plain[5]
之类的语法从中读取内容,但是不能使用plain[5] = 'a';
进行分配。
答案 1 :(得分:4)
在主函数中的普通数组和crypt数组之前删除“ const char”以查看实际问题。
plan和crypt数组之前的“ Const Char”实际上声明了两个具有相同名称的新本地char数组常量。由于“ const” char数组只能在声明时进行初始化,因此main中的初始化不会引发错误,因为它们不是相同的全局conts数组。
中建议使用Const指针代替const答案 2 :(得分:2)
另一种查看方式是plain
和crypt
都将衰减到访问时的指针(受C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3)中的异常的影响)。那么,为什么不只使用全局指针开始,然后可以根据需要在整个代码中重新分配它呢?
这提供了(1)字符串文字的赋值灵活性; (2)常数数组;或(3)来自复合文字初始值设定项。您可以#define
指向plain
和crypt
的大小(字符数)常量。
例如:
#include <stdio.h>
#define NC 3 /* number of chars (26 for you) */
const char *plain, *crypt; /* global pointers */
void prnchars (const char *arr)
{
for (int i = 0; i < NC; i++)
putchar (arr[i]);
putchar ('\n');
}
int main (void) {
plain = "abc"; /* assigning literals */
crypt = "def";
prnchars (plain);
prnchars (crypt);
crypt = "ghi"; /* reassign at will */
prnchars (crypt);
const char foo[] = "jkl"; /* constant arrays */
crypt = foo;
prnchars (crypt);
crypt = (const char[]){'m', 'n', 'o'}; /* compound literals */
prnchars (crypt);
return 0;
}
使用/输出示例
$ ./bin/global_ptr
abc
def
ghi
jkl
mno
这只是解决问题的另一种方式。