我有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};
答案 0 :(得分:0)
该行
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};
答案 1 :(得分:0)
在前面的示例中,变量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};
答案 2 :(得分:0)
这里有一堆误解没有得到解决。但首先,大象:
std::string更安全,几乎让所有这些都变得容易。
char *ArrTemp[8][15];//[number of strings][max size of every string]
不会生成一个c风格的字符串数组。请注意,类型为char *
。它生成一个8x15指向c风格字符串的指针数组。根据您的需要,您也可以。
char ArrTemp[8][15];
为8个14个char c样式的字符串分配存储空间(一个字符总是丢失到终止NULL)。然后,您必须将字符串复制到数组中,但您可以完全控制存储可以更改数组的内容。如果你现在还不知道文件名是什么,只是想要存储,那么这就是c风格的阵列方式。
或
char * ArrTemp[8];
这将创建一个包含8个指向c风格字符串的指针的数组,然后您必须指向字符串。
接下来,
char temp1[] = "temp1.txt";
制作一个10个字符的数组并复制" temp1.txt"进去。如果你想改变temp1,你最好记住它的10个字符,因为如果你
char * ArrTemp[] =
{
temp1,
...
}
轻松访问temp1的大小 - sizeof(temp1)
- 将丢失。 sizeof(ArrTemp[0])
将返回指向temp1的指针大小,可能是4或8个字节,而不是sizeof(temp1)
。
这意味着需要再修改一次。
char temp1[16] = "temp1.txt";
您必须预先定义数组的大小。注意我使用16来适应终止NULL。但16是一个丑陋的解决方案。有可能让16个中的许多人在代码中浮动,当你想要21个以后会发生什么?你必须追捕所有16个并改变它们。不是一个好主意,所以还有一点点修改:
#define MAX_STRING_LENGTH 15
和
char temp1[MAX_STRING_LENGTH + 1] = "temp1.txt";
再次,为空的+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。
这使得以上所有可变 - 不可变,"我的char数组的大小是多少?"问题消失了。
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的工具库(如+
)进行追加,并=
进行分配。
更清洁,更易于使用。