如何在目标C中检查字符数组是否为空

时间:2009-11-04 11:58:20

标签: objective-c

如何在目标C中检查字符数组是否为空?

char hName[255]; 
- (void)setHost {
     phent = gethostbyaddr((const char*)&haddr, sizeof(int), AF_INET);
     if(phent){  
     strncpy(hName,phent->h_name,255);                                      

}

-(void) getHost {
    NSString *str = [[NSString alloc] initWithBytes:tTemp.hName 
    length:sizeof(tTemp.hName) encoding:NSASCIIStringEncoding];
 }

我有一个名为hName [255]的字符数组。我会在项目的某个时刻为这个数组赋值。现在我需要检查hName [255]是否包含空值。我尝试了一些方法。我从该数组中获取一个字符串str并检查它是否等于@“”;它失败了。然后我检查字符串str的长度。即使数组不包含任何值,它也将返回255.如何检查数组是否包含空值。有帮助吗?在此先感谢!!

2 个答案:

答案 0 :(得分:9)

您可能需要详细说明您的问题。例如,要检查指针是否为null非常简单:

char *my_chars;

...

if (! my_chars)
  NSLog(@"Woo, my_chars is null");
else
  NSLog(@"my_chars is at 0x%08x", my_chars);

因为null只是0:)


然而,看起来这不是你的问题。你已经创建了一个像这样的字符数组

char my_chars[255];

所以my_chars不会为空。

然而,正如outishis answer所说,你刚刚分配了它而没有将内容归零,所以你不知道那些255个字节是什么!在他建议的三个选项中,我个人会选择这个:

char my_chars[255];
memset(my_chars, 0, sizeof(my_chars));

现在,你有一个255个零的数组:)这很容易检查它是否为null:

if (0 == strlen(my_chars))
  NSLog(@"It's not null but it is an empty string!");
else
  NSLog(@"my_chars contains a valid string which is %i chars long", strlen(my_chars));

希望有所帮助。

萨姆

答案 1 :(得分:0)

首先,请注意“null”这个词是重载的。你可以有空指针和空(空)字符串,并且有空字符('\ 0',转换为int:((int)'\0') == 0时等于0)。还有未初始化的变量,可能是也可能不是。我猜你在谈论一个未初始化的字符数组,用作c字符串。

最有可能的是,hName正在堆栈上分配(我看不到更多的源代码),这意味着它是not zero-initialized。实际上,hName将保存最后存储在hName占用的内存区域中的任何数据。你需要自己初始化它。

char hName[255] = {0};
// or
memset(hName, 0, sizeof(hName));
// or, if you have bzero
bzero(hName, sizeof(hName));

另请注意,由于hName被声明为数组而不是指针,sizeof(hName)是它存储的字符数。

void test() {
    char *name1 = "";
    char name2[255];
    // All the following lines will be true
    strlen(name1) == 0;
    sizeof(name2) == 255
    0 <= strlen(name2) && strlen(name2) < 255;
    // pointers are 4 or 8 bytes on most machines these days
    sizeof(name1) == 4 || sizeof(name1) == 8;
}

编辑(寻址代码示例):

strgetHost的长度为255,因为当您从tTemp.hName复制时,它告诉它具有该长度。 NSStrings可以包含空值,但是您可能难以打印它们以及后面的任何字符。

代码示例中不清楚hName是全局(globals are bad)还是属性。同样,其他变量的范围,例如haddrtTemp,也不清楚。其中一些应该是方法的参数。

名称“setHost”应该保留给setter,它是一对获取和设置属性的方法(“访问者”,用Objective-C说法)。他们返回并分别采取一种理论上属于财产类型的类型。在这种情况下,NSString*最有意义;最好在代码中使用NSString并切换到(通过NSString的cStringUsingEncoding:UTF8String)。 -(void)setHost:(NSString*)的合作伙伴为-(NSString*)host

切换到NSString(并使用stringFromCString:withEncoding:)后,您只需检查其长度或将其与@""进行比较即可检查空字符串。

@interface MyHost : NSObject {
    NSString *name_;
    ...
}
/* post ObjC 2.0 */
@property(retain) NSString* name;
/* pre ObjC 2.0 */
-(NSString*)name;
-(void)setName:(NSString*);

/* any ObjC version */
-(int)setHostFromAddress:(MyAddress*)addr;
...
@end

@implementation MyHost
/* post ObjC 2.0 */
@synthesize name = name_;
-(int)setHostFromAddress:(MyAddress*)addr {
    struct hostent *phost;
    phost = gethostbyaddr(addr.address, addr.length, addr.type);
    if (phost) {
        self.name = [NSString stringWithCString:phost->h_hname encoding:NSASCIIStringEncoding];
    }
    return h_errno;
}

/* pre ObjC 2.0 */
-(NSString*)name {
    return name_;
}
-(NSString*)setName:(NSString*)nom {
    [name_ release];
    name_ = [nom retain];
}
-(int)setHostFromAddress:(MyAddress*)addr {
    struct hostent *phost;
    phost = gethostbyaddr([addr address], [addr length], [addr type]);
    if (phost) {
        [self setName:[NSString stringWithCString:phost->h_hname  encoding:NSASCIIStringEncoding]];
    }
    return h_errno;
}
...
@end