我的程序中有很多数组都有这个问题,我无法理解为什么.我想我对阵列理论有所遗漏.
"有人"在我的数组的末尾添加了某些字符,例如?^)(&%.例如,如果我有一个带有"hello"的长度为5的数组,那么它已经满了,有时会打印你好?() /&%%.如果它只有5个元素并且我只使用5个,那么它可能会发生意外,所以也许其他5个元素会得到一些随机值,但如果它已满,那么地狱会得到那些奇怪的值?
我通过manaully添加字符'\ 0'来部分解决它.
例如,当我尝试从另一个数组填充数组时,会出现此问题(我从fgets读取一行测试文件,然后我必须提取单个单词):
...
for(x=0;fgets(c,500,fileb);x++) { // read old local file
int l=strlen(c);
i=0;
for (k=0;k<(l-34);k++) {
if(c[k+33]!='\n') {
userDatabaseLocalPath[k]=c[k+33];
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
C中的字符串由值为0的字符终止,通常称为字符文字,即'\0'.
大小为5的字符数组不能保存字符串hello,因为终结符不适合.期望终结符的函数将会混淆.
要声明一个包含字符串的数组,要使用的最佳语法是:
char greeting[] = "hello";
Run Code Online (Sandbox Code Playgroud)
这样,您就不需要指定长度(计算字符数),因为编译器会为您执行此操作.而且你也不需要包含终止符,它会自动添加,所以上面会在内存中创建它:
+-+-+-+-+-+--+
greeting: |h|e|l|l|o|\0|
+-+-+-+-+-+--+
Run Code Online (Sandbox Code Playgroud)
你说你有"从另一个更长的阵列填充数组"的问题,这听起来像一个大多数被称为字符串复制的操作.由于字符串只是带有终结符的数组,因此除非您知道存在额外的空间,否则不能盲目地将较长的字符串复制到较短的字符串上.
鉴于上述情况,此代码将调用未定义的行为:
strcpy(greeting, "hi there!");
Run Code Online (Sandbox Code Playgroud)
因为被复制到greeting数组中的字符串比数组有空间的字符串长.
这通常通过使用"已知足够大"缓冲区或添加手动跟踪所用空间的检查来避免.有一个函数被称为strncpy()这样做,但我不建议使用它,因为它的确切语义是相当奇怪的.