为什么我的条件检测不到空字符?

Why can't my conditional detect an empty char?

我正在尝试创建“字符串数组计数”函数。它是如何工作的?如果 char 为空,循环将停止,然后将显示长度。错误是,空字符条件未检测到空字符。结果是无限循环。

编辑:我希望函数的结果是 3

#include <stdio.h>

#define s 1000
int strarrlen(char str[s][s]){
    int i, len = 0;
    while (1){
        if(str && !str[i]){
            break;
        } else {
            len += 1;
        }
        i++;
    }
    return len;
}

int main(){
    char words[s][s] = {"First", "Second", "Third"};
    printf("words array total is %i", strarrlen(words));
}

C语言的数组没有任何元数据,不做标记怎么找结尾。通常对于数组或指针,您使用 NULL 作为停止值。

#include <stdio.h>

//You don't need to hardcode your array size with pointers, just check for nullity
int strarrlen(char **str){
    int i, len = 0;
    
    if (str == NULL) {
        return 0;
    }
    while (str[i] != NULL){
        i++;
    }
    return i;
}

int main(){
    char words[s][s] = {"First", "Second", "Third", NULL};
    printf("words array total is %i", strarrlen(words));
}

此处您使用的是真正的二维数组。这意味着您有 s (1000) 个 s 字符数组。当你初始化它时,C 语言确保所有未使用的字符都是 0。

这意味着第一个未使用的插槽将是第一个第一个字符为0的插槽。所以你的代码应该是:

#include <stdio.h>

#define s 1000
int strarrlen(char str[s][s]){
    int i=0, len = 0;     // do not forget to initialize i
    while (1){
        if(str && !str[i][0]){  // str[i] is the address of the i-th array
            break;
        } else {
            len += 1;
        }
        i++;
    }
    return len;
}

int main(){
    char words[s][s] = {"First", "Second", "Third"};
    printf("words array total is %i", strarrlen(words));
}

也就是说,二维数组通常用于数值计算,但很少用于处理字符串。一种更常见的方法是使用带有 NULL 分隔符的指针数组:char words[1000][1000] 在内存中使用 1000000 个字符,但 char *words[] = {"First", "Second", "Third", NULL}; 只需要 19 个字符和 4 个指针,因此在 32 位架构上为 36 个字节,在 51 64 位上的字节。

但是你在这里测试指针是否为空:

#include <stdio.h>

int strptrlen(char **str) {
    int i = 0, len = 0;
    while (1) {
        if (str && !str[i]) {
            break;
        }
        else {
            len += 1;
        }
        i++;
    }
    return len;
}

int main() {
    char *words[] = { "First", "Second", "Third", NULL };
    printf("words array total is %i", strptrlen(words));
}