如何在目标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.如何检查数组是否包含空值。有帮助吗?在此先感谢!!
答案 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不会为空。
然而,正如outis中his 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;
}
编辑(寻址代码示例):
str
中getHost
的长度为255,因为当您从tTemp.hName
复制时,它告诉它具有该长度。 NSStrings可以包含空值,但是您可能难以打印它们以及后面的任何字符。
代码示例中不清楚hName
是全局(globals are bad)还是属性。同样,其他变量的范围,例如haddr
和tTemp
,也不清楚。其中一些应该是方法的参数。
名称“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