有没有办法知道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;
}
答案 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'
绝对不能保证这样做。因此,它将被归类为未定义的行为,因为它依赖于编译器和运行时实现。
希望这有帮助, 最好的祝福, 汤姆。