如何检查数组大小而不打印空值

  • 本文关键字:打印 空值 何检查 数组 c
  • 更新时间 :
  • 英文 :


请认识c 100年的人向我解释我在看什么。我是否走上了将学习c作为职业的正确道路?哇,这是什么我真的很想知道这里发生了什么

#include <stdio.h>
#include <string.h>
int main() {
char *checkArr[1000] = {"This is very good", 
"text that has been",
"put into a file for", 
"the purposes of", 
"being an example.", NULL};
int size2 = strlen(checkArr);
printf("Check Array size: %dn", size2);
for (int i =0; i < strlen(checkArr); i++){
printf("%sn", checkArr[i]);
}
char *checkArr2[1000] = {"This is very good", 
"text that has been",
"put into a file for", 
NULL, 
NULL, NULL};
int size3 = strlen(checkArr2);
printf("Check Array size: %dn", size3);
for (int i =0; i < strlen(checkArr2); i++){
printf("%sn", checkArr2[i]);
}
for (int i =0; i < strlen(checkArr2); i++){
printf("%sn", checkArr2[i]);
}
char *checkArr3[1000] = {"This is very good", 
"text that has been",};
int size4 = strlen(checkArr3);
printf("Check Array size: %dn", size4);
for (int i =0; i < strlen(checkArr3); i++){
printf("%sn", checkArr3[i]);
}
char *checkArr4[1000] = {"This is very good", 
"text that has been",
NULL, 
NULL, 
NULL, NULL};
int size5 = strlen(checkArr4);
printf("Check Array size: %dn", size5);
for (int i =0; i < strlen(checkArr4); i++){
printf("%sn", checkArr4[i]);
}
return 0;
}

请在下面解释一下,标准输出

Check Array size: 5
This is very good
text that has been
put into a file for
the purposes of
being an example.
Check Array size: 5
This is very good
text that has been
put into a file for
(null)
(null)
This is very good
text that has been
put into a file for
(null)
(null)
Check Array size: 5
This is very good
text that has been
(null)
(null)
(null)
Check Array size: 5
This is very good
text that has been
(null)
(null)
(null)

这怎么可能。所有这些数组怎么能有相同大小的长度???

strlen()提供单个字符串的长度。所以当你

char *checkArr[1000] = {"This is very good", 
...,
NULL};
int size = strlen(checkArr);

您要求strlen()测量一个字符串数组,但它并不是这样做的。你的compilter会抱怨:

main.c:16:20: warning: passing argument 1 of ‘strlen’ from incompatible pointer type [-Wincompatible-pointer-types]
int size = strlen(checkArr);

这是对的——你把指针传错了。如果你这样做了:

char *checkArr[1000] = {"This is very good", 
...,
NULL};
int size_of_string_0 = strlen(checkArr[0]);

那就行了——但这不是你想要衡量的。

那么问题来了,你想测量什么?

如果你想测量的是数组的长度,那么在你的例子中它总是1000,因为这是你定义的大小

char *checkArr[1000] = {"This is very good", 
...,
NULL};
int size_of_array = sizeof(checkArr)/sizeof(checkArr[0]); // will be 1000

如果你想测量的是初始化数组时使用的东西的数量,那么你需要自己计算这些东西。所有未初始化的都设置为默认值,因此所有1000个都存在,但无法知道哪些是手动初始化的,哪些是为您完成的。

如果你想确定的是指针数组的长度,直到第一个NULL指针,那么你需要自己计算这些条目。但你可以做到这一点——你需要编写自己的函数。类似于:

// I use size_t instead of int.  For why, see:
// https://stackoverflow.com/questions/131803/unsigned-int-vs-size-t
size_t arrlen(char **checkArr) {
size_t len = 0;
for (;*checkArr != NULL; checkArr++)
len++;
return len;
}

因此,您所需要做的就是确保所有指针数组的值都设置为NULL。

这是整个代码:

#include <stdio.h>
#include <string.h>
size_t arrlen(char **checkArr) {
size_t len = 0;
for (;*checkArr != NULL; checkArr++)
len++;
return len;
}
int main() {
char *checkArr[1000] = {"This is very good", 
"text that has been",
"put into a file for", 
"the purposes of", 
"being an example.",
NULL};
int size2 = arrlen(checkArr);
printf("Check Array size: %dn", size2);
for (int i =0; i < arrlen(checkArr); i++){
printf("%sn", checkArr[i]);
}
puts("");

char *checkArr2[1000] = {"This is very good", 
"text that has been",
"put into a file for", 
NULL, 
"being an example.",
NULL};
int size3 = arrlen(checkArr2);
printf("Check Array size: %dn", size3);
for (int i =0; i < arrlen(checkArr2); i++){
printf("%sn", checkArr2[i]);
}
puts("");

char *checkArr3[1000] = {"This is very good", 
"text that has been",
NULL};
int size4 = arrlen(checkArr3);
printf("Check Array size: %dn", size4);
for (int i =0; i < arrlen(checkArr3); i++){
printf("%sn", checkArr3[i]);
}
puts("");

char *checkArr4[1000] = {"This is very good", 
"text that has been",
NULL, 
"the purposes of", 
"being an example.",
NULL};
int size5 = arrlen(checkArr4);
printf("Check Array size: %dn", size5);
for (int i =0; i < arrlen(checkArr4); i++){
printf("%sn", checkArr4[i]);
}
puts("");

return 0;
}

请在此处尝试:https://onlinegdb.com/r1QOTg2m_

如果您想计算不为NULL的项的数量,即使有些项为NULL,那么您需要传入初始化项的大小,并让循环检查每个项是否为NULL。类似于:

#include <stdio.h>
#include <string.h>
size_t arritems(char *checkArr[], size_t size) {
int count = 0;
for (size_t len = 0; len<size; len++)
if(checkArr[len] != NULL) {
count++;
}
return count;
}
int main() {
char *checkArr[1000] = {"This is very good", 
"text that has been",
"put into a file for", 
"the purposes of", 
"being an example.",
NULL};
int size2 = arritems(checkArr,6);
printf("Check Array size: %dn", size2);
char *checkArr2[1000] = {"This is very good", 
"text that has been",
"put into a file for", 
NULL, 
"being an example.",
NULL};
int size3 = arritems(checkArr2,6);
printf("Check Array size: %dn", size3);
char *checkArr3[1000] = {"This is very good", 
"text that has been",
NULL};
int size4 = arritems(checkArr3,3);
printf("Check Array size: %dn", size4);
char *checkArr4[1000] = {"This is very good", 
"text that has been",
NULL, 
"the purposes of", 
"being an example.",
NULL};
int size5 = arritems(checkArr4,6);
printf("Check Array size: %dn", size5);
return 0;
}

请在此处尝试:https://onlinegdb.com/S1g90lhXu

前面是我的热门评论。

您正在复制代码。最好添加(例如(print_array函数来进行NULL限制打印。

请注意,checkArr3不具有NULL终止符


下面是一些重构的代码。我已经用我提到的COUNTOF宏替换了strlen调用,但这仍然不能很好地工作。

我使用了cpp条件词来表示旧代码与新代码(例如(:

#if 0
// old code
#else
// new code
#endif

不管怎样,它在这里:

#include <stdio.h>
#include <string.h>
#define COUNTOF(_arr) 
(sizeof(_arr) / sizeof(_arr[0]))
void
print_array(char **arr)
{
for (;  *arr != NULL;  ++arr)
printf("%sn",*arr);
}
int
main()
{
char *checkArr[1000] = {
"This is very good",
"text that has been",
"put into a file for",
"the purposes of",
"being an example.",
NULL
};
int size2 = COUNTOF(checkArr);
printf("Check Array size: %dn", size2);
#if 0
for (int i = 0; i < COUNTOF(checkArr); i++) {
printf("%sn", checkArr[i]);
}
#else
print_array(checkArr);
#endif
char *checkArr2[1000] = {
"This is very good",
"text that has been",
"put into a file for",
NULL,
NULL,
NULL
};
int size3 = COUNTOF(checkArr2);
printf("Check Array size: %dn", size3);
#if 0
for (int i = 0; i < COUNTOF(checkArr2); i++) {
printf("%sn", checkArr2[i]);
}
for (int i = 0; i < COUNTOF(checkArr2); i++) {
printf("%sn", checkArr2[i]);
}
#else
print_array(checkArr2);
#endif
char *checkArr3[1000] = {
"This is very good",
"text that has been",
#if 1
NULL
#endif
};
int size4 = COUNTOF(checkArr3);
printf("Check Array size: %dn", size4);
#if 0
for (int i = 0; i < COUNTOF(checkArr3); i++) {
printf("%sn", checkArr3[i]);
}
#else
print_array(checkArr3);
#endif
char *checkArr4[1000] = {
"This is very good",
"text that has been",
NULL,
NULL,
NULL,
NULL
};
int size5 = COUNTOF(checkArr4);
printf("Check Array size: %dn", size5);
#if 0
for (int i = 0; i < COUNTOF(checkArr4); i++) {
printf("%sn", checkArr4[i]);
}
#else
print_array(checkArr4);
#endif
return 0;
}

最新更新