c end char中的char数组

时间:2012-02-23 18:00:50

标签: c arrays char

我正在从一个socket读取一个char数组,我想知道何时停止阅读。终止字符序列是'\ r \ n \ r \ n'。如果我读入的内容小于数组大小,我不想再循环了。我的问题是,如果我加载到数组中说10个字符并且它的长度为20,那么数组[20]索引设置为什么?

由于

编辑:

抱歉,我的意思是数组[19],根据建议将最后一个索引设置为NULL?似乎是一个合适的解决方案为了提供更多细节,我需要知道何时从套接字读取所有数据。我不知道要发送的数据的大小只是它以'\ r \ n \ r \ n \ n'终止

6 个答案:

答案 0 :(得分:2)

如果它的长度为20,那么数组[20]就在你的数组之外,不应该像那样被访问(除非你想做某种巫术和黑客攻击)。

编辑:如果你的意思是数组[19],那么没有。您需要在数组索引=接收的字符串大小设置 NUL 字符。 ASCII NUL 字符'\0'不是C NULL 常量,对于32位机器,它将是4字节长,并且可能会覆盖数据。

答案 1 :(得分:1)

  

我的问题是,如果我加载到数组中说10个字符并且它的长度为20,那么数组[20]索引设置为什么?

它没有任何设定。随意将其设置为自己的东西(例如,空终止符)。

答案 2 :(得分:1)

通常在效率名称中,C不会将数组初始化为任何已知值,因此您将获得内存中剩余的任何内容。

您可以显式初始化数组以解决此问题。字节序列的常见初始化为零,与搜索字符串不匹配,如果您尝试将数组作为字符串处理,它将作为字符串结尾。

char array[20] = {0}; /* the extra elements are always initialized to 0 as well */
char array2[20];
memset(array2, 0, sizeof(array2));

我认为你输错了,而不是array[19]而是array[20]

答案 3 :(得分:1)

在C中,当数组被malloced时,数组中包含malloced内存块中的剩余内容。如果将几个字符复制到数组中并希望将字符作为字符串读取,则必须将最后一个字符后面的下一个字符设置为'\ 0'。

答案 4 :(得分:1)

由于您知道何时停止阅读,您可以将数组中的下一个字符设置为'\0'以标记字符串的结尾。

答案 5 :(得分:0)

据我所知,ANSI C标准没有描述应该为未初始化的数组分配什么值。认为它是垃圾,并假设没有任何关于它的说法。虽然,我大多观察到它们是0(使用gcc)。这种实现可能因编译器而异。

此外,此值可能取决于已修改数组[19]的先前步骤(如mOskitO所指出的,数组[20]超出范围)。