Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++;2010_C++_Arrays - Fatal编程技术网

C++ C++;2010

C++ C++;2010,c++,arrays,C++,Arrays,我有8个文本文件(存在于我的程序文件中),我想在数组中分配它们。但我遇到了这个错误: (类型为“char*”的值不能用于初始化类型为“int”的实体)。 我的每个文件最多有15个字符 char *ArrTemp[8][15];//[number of strings][max size of every string] char temp1[] = "temp1.txt"; char temp2[] = "temp3.txt"; char temp3[] = "temp5.txt"; char

我有8个文本文件(存在于我的程序文件中),我想在数组中分配它们。但我遇到了这个错误: (类型为“char*”的值不能用于初始化类型为“int”的实体)。 我的每个文件最多有15个字符

char *ArrTemp[8][15];//[number of strings][max size of every string]
char temp1[] = "temp1.txt"; 
char temp2[] = "temp3.txt";
char temp3[] = "temp5.txt";
char temp4[] = "temp7.txt";
char temp5[] = "temp9.txt";
char temp6[] = "temp11.txt";
char temp7[] = "temp13.txt";
char temp8[] = "temp15.txt";
ArrTemp[8][15] = {temp1,temp2,temp3,temp4,temp4,temp6,temp7,temp8};
线路

ArrTemp[8][15] = {temp1,temp2,temp3,temp4,temp4,temp6,temp7,temp8};
这是不对的。这不是初始化。它尝试将RHS分配给LHS

拆下线路

char *ArrTemp[8][15];//[number of strings][max size of every string]
然后,使用:

char* ArrTemp[8] = {temp1,temp2,temp3,temp4,temp4,temp6,temp7,temp8};
或者干脆

char* ArrTemp[] = {temp1,temp2,temp3,temp4,temp4,temp6,temp7,temp8};

在前面的示例中,变量ArrTemp声明为char指针,但用作二维char数组,这会引发错误。您可以尝试使用指针数组来存储不同长度的字符串。请参考以下代码:

char temp1[] = "temp1.txt";
char temp2[] = "temp3.txt";
char temp3[] = "temp5.txt";
char temp4[] = "temp7.txt";
char temp5[] = "temp9.txt";
char temp6[] = "temp11.txt";
char temp7[] = "temp13.txt";
char temp8[] = "temp15.txt";

char *ArrTemp[] = {temp1,temp2,temp3,temp4,temp4,temp6,temp7,temp8};

这里有许多误解没有得到解决。但首先,大象:

更安全,而且几乎所有这些都很容易

char *ArrTemp[8][15];//[number of strings][max size of every string]
不生成c样式字符串的数组。请注意,类型为
char*
。它生成指向c样式字符串的8x15指针数组。取决于你想要什么,你可以选择

char ArrTemp[8][15];
为8个14字符的c样式字符串分配存储空间(一个字符总是丢失给终止的NULL)。然后,您必须将字符串复制到数组中,但您可以完全控制存储并更改数组的内容。如果此时您不知道文件名是什么,只需要存储,那么这就是c风格的数组方式

这将创建一个包含8个指向c样式字符串的指针的数组,然后必须指向字符串

其次,

制作一个10个字符的数组并将“temp1.txt”复制到其中。如果你想改变temp1,你最好记住它是10个字符,因为如果你

char * ArrTemp[] = 
{
    temp1,
    ...
}
无法轻松访问temp1的大小--
sizeof(temp1)
sizeof(arrtep[0])
将返回指向temp1的指针的大小,可能是4或8个字节,而不是
sizeof(temp1)

这意味着需要再做一次修改

char temp1[16] = "temp1.txt"; 
必须预定义数组的大小。注意,我使用16来拟合终止NULL。但16岁是一个丑陋的解决方案。代码中可能会有许多16位左右浮动,当您想要21位之后会发生什么?你必须找到所有16岁的孩子,并改变他们。这不是个好主意,所以还有一个小小的修改:

#define MAX_STRING_LENGTH 15

同样,+1表示空值

但是

如果temp1永远不会改变,你可以

const char * temp1 = "temp1.txt";
然后,对ArrTemp稍作修改,就可以

const char * ArrTemp[] = 
{
    temp1,
    ...
}
但是如果您已经这样做了,那么您就可以省去一些麻烦,直接在ArrTemp中定义c样式的字符串

const char *ArrTemp[]
{
    "temp1.txt",
    "temp3.txt",
    "temp5.txt",
    "temp7.txt",
    "temp9.txt",
    "temp11.txt",
    "temp13.txt",
    "temp15.txt",
};
回到std::string

这使得上述所有可变不变,“我的字符数组大小是多少?”问题消失了

std::string ArrTemp[]
{
    "temp1.txt",
    "temp3.txt",
    "temp5.txt",
    "temp7.txt",
    "temp9.txt",
    "temp11.txt",
    "temp13.txt",
    "temp15.txt",
};
您已将8个字符串预加载到ArrTemp中。字符串可以更改。绳子的长度无关紧要。如果您试图过度填充std::string,它会变得更大。您可能必须用RAM运行计算机,以超过其容量。您可以利用std::string的工具库,如
+
进行追加,并
=
进行分配


更干净、更易于使用。

您需要
const char*temp1=“temp1.txt”等和
常量字符*ArrTemp[8]也注意
{temp1,temp2,temp3,temp4,temp4,temp6,temp7,temp8}
只能出现在初始化中,这样对赋值不起作用。我建议将文本声明为
静态常量
,例如:
静态常量temp1[]=“temp1.txt”静态
表示只有一个实例。
const
表示只读。这允许编译器将数据放在可执行文件的只读段中。编译器可以发出代码直接访问实例,而不是像某些编译器那样,在堆栈上预留空间,并将文字复制到堆栈中。因为您使用C++,您可能还需要查看STD::vector和STD::String。在某些地方,不应该有一个<代码> const <代码>,因为文字是常数字符吗?@ ToMasMatthWS,当您使用<代码> char Tun1[] =“Time1.txt”时,
temp1
制作了字符串文字的副本,可以修改。缺点是数组的大小将适合源字符串,如果用户以后想更改这些字符串,则会导致额外的簿记或长度猜测雷区。@user4581301,我同意。他们当然可以选择显式指定数组的大小,以获得一点灵活性<代码>字符temp1[ARRAY_SIZE]=“temp1.txt”const char * ArrTemp[] = { temp1, ... }
const char *ArrTemp[]
{
    "temp1.txt",
    "temp3.txt",
    "temp5.txt",
    "temp7.txt",
    "temp9.txt",
    "temp11.txt",
    "temp13.txt",
    "temp15.txt",
};
std::string ArrTemp[]
{
    "temp1.txt",
    "temp3.txt",
    "temp5.txt",
    "temp7.txt",
    "temp9.txt",
    "temp11.txt",
    "temp13.txt",
    "temp15.txt",
};