我基本上想要根据给定的数字存储学生姓名数组。例如,如果用户想要插入5个名称,那么数组大小将为5.如果用户想要插入10个名称,则数组大小将为10.
我有一个像这样的方法来为数组中的特定元素设置名称。
void setNames(char *names){
strcpy(name[i], names);
}
事情是,我该如何进行数组绑定检查?我听说你只能在索引为-1
时添加。
答案 0 :(得分:1)
编辑(因为OP表示他实际上想要C):
C回答
您可以做的是创建一个char
数组:
char [N][name_length]
其中N - 数字“用户想要”(我假设用户将以某种方式将其输入到您的程序中),name_length - 名称可以具有的最大长度(C字符串,即以空字符结尾的字符串)。
或创建一个自己的struct
数组(每个都包含一个单独的名称,也可能包含其他一些信息)。
C ++回答
在C ++中执行此操作的典型方法是使用std::vector<std::string>
(假设您只想将名称存储为std::string
)。
然后使用push_back()
函数添加新元素。而且,由于vector在C ++中实现为动态数组,因此您不必进行绑定检查。
答案 1 :(得分:1)
数组不保持自己的大小,你必须为它们做到这一点。这就是为什么向量更容易处理的原因之一,以及为什么每个人都会说“wtf,原始数组?使用向量”。数组只是一块连续的内存,就是这样。向量包含一个数组,并允许您在某种程度上像数组一样使用它,但它会为您处理大量的内务处理细节。
无论如何,如果你真的想使用原始数组,那么你需要传递大小信息。 C字符串是一个以null结尾的数组 - 只是一个普通的旧数组,但最后一个元素是\0
。这样你就可以在不知道它的大小的情况下从中读取它,只是不要读过末尾的空字符(龙在那里)。
答案 2 :(得分:0)
使用C / C ++编程时(除非使用C ++ 11或更新版本),您将操作数组作为指针。这意味着除非你保存,否则你不会知道数组的大小。 char str[10]
的真正含义是str's address + 10 * sizeof(char)
。你在这里直接处理记忆。
如果你想要一个高级方法,请看一下C ++ 11。 std::array
和std::vector
适合您。从documentation开始,查看std::array
的定义方式:
template <
class T,
std::size_t N
> struct array;
这意味着它存储自己的大小并具有有用的功能,例如size()
,at()
,back()
等。
答案 3 :(得分:0)
C代码需要跟踪另一个变量中的数组大小。
typedef struct {
char **name;
size_t n;
} Names_T;
void Names_Set(Names_T *names, size_t index, const char *name) {
// See if it is a special value and then append to the array
if (index == (size_t) -1) {
index = names->n;
}
if (index >= names->n) {
size_t newsize = index + 1;
// OOM error handling omitted
names->name = realloc(names->name, newsize * sizeof *names->name);
while (names->n < newsize) {
names->name[names->n++] = NULL;
}
}
char *oldname = names->name[index];
names->name[index] = strdup(name);
free(oldname);
}
void Names_Delete(Names_T *names) {
while (names->n > 0) {
names->n--;
free(&names->name[names->n]);
names->name[names->n] = NULL;
}
free(names->name);
names->name = NULL;
}
int main(void) {
Names_T names = { NULL, 0 };
Names_Set(&names, 3, "Sam"); // set array element 3
Names_Set(&names, (size_t) -1, "Thers"); // Append to array
Names_Delete(&names);
return 0;
}