我们怎么知道C中的字符串元素是未初始化的?

时间:2010-01-31 18:22:45

标签: c string initialization

有没有办法知道C中字符串中的元素是否有值?我尝试过使用NULL,''和'',但它们似乎没有用。我需要将字符向下移动到索引0而不使用stdlib函数。

#include <stdio.h>

int main()
{  
   char literal[100];

   //literal[99] = '\0'
   literal[98] = 'O';
   literal[97] = 'L';
   literal[96] = 'L';
   literal[95] = 'E';
   literal[94] = 'H';

   int index = 0;

   while(literal[index] != '\0')
   {
      if(literal[index] == NULL)   // does not work
         printf("Empty");              

      else
         printf("%c", literal[index]);

      ++index;                  
   }

   getchar();
   return 0;

}

7 个答案:

答案 0 :(得分:5)

没有。由于literal具有自动存储功能,因此不会初始化其元素,数组中的值未定义。

您可以将每个元素初始化为特殊内容并检查该值。 例如你可以改变

char literal[100];

char literal[100] = {0};

将每个元素初始化为0。 您必须将while循环终止检查更改为

while(index < 100) {
  if(literal[index] == 0) 
         printf("Empty"); 
   ...
  }
}

如果你需要在数组上执行更多的字符串操作,那可能不是最佳的,因为0现在表示空元素,也是'字符串结尾'。

答案 1 :(得分:3)

不,你不能这样做。这是因为 会有一个值 - 没有办法知道这个值是什么。这就是为什么必须将事物初始化为已知值。

答案 2 :(得分:1)

C不默认初始化任何内容。因此,字符串中的内容是该内存中的任何垃圾,无论最后在堆栈中使用它。您需要将每个文字值显式设置为一个意味着“取消设置”的值。

答案 3 :(得分:1)

不,无法知道数组的值。但是,您可以使用所选的“默认”值对其进行初始化,然后再对其进行检查。

答案 4 :(得分:1)

你需要将字符串的结尾设置为0(零)或'\ 0' - C只为你自动为字符串文字而不是堆栈上的局部变量

尝试

memset(&literal, 0, 100);

或者只是取消注释将索引99处的文字设置为'\ 0'

的行

答案 5 :(得分:0)

c字符串只是一堆内存位置和约定 '\0'标记结束。没有编译器实施,也没有附加的元数据(除非你构建一个结构来提供它)。

内存中的每个单元格,总是都有一个值,所以每个字符串总是有一个值,你不能保证它是合理的,甚至不会在分配的空间中结束。

确保存在有意义的数据您的责任,这表明您应该在声明时或分配后立即初始化所有字符串。该规则的例外情况很少见,并且风险自负。

答案 6 :(得分:0)

不,这是运行时的未定义行为,对于我们所关心的所有内容都可以推送一些二进制ASCII字符,你真的不想进入那个。处理它的最好方法是使用for循环并迭代它或使用calloc初始化指针但将其设置为0.

for (i = 0; i < 100; i++) literal[i] = '\0';

OR

char *literalPtr = (char*)calloc(100, sizeof(char)); // Array of 99 elements plus 1 for '\0'

绝对不能保证这样做。因此,它将被归类为未定义的行为,因为它依赖于编译器和运行时实现。

希望这有帮助, 最好的祝福, 汤姆。