数组填写C

phc*_*aze 2 c arrays

我的程序中有很多数组都有这个问题,我无法理解为什么.我想我对阵列理论有所遗漏.

"有人"在我的数组的末尾添加了某些字符,例如?^)(&%.例如,如果我有一个带有"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)

谢谢

unw*_*ind 5

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()这样做,但我不建议使用它,因为它的确切语义是相当奇怪的.