为什么我的条件检测不到空字符?
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));
}
我正在尝试创建“字符串数组计数”函数。它是如何工作的?如果 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));
}