【问题标题】:How to check a character array is null in objective C如何检查目标C中的字符数组是否为空
【发布时间】:2010-12-13 00:01:43
【问题描述】:

如何在 Objective 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。如何检查数组是否包含空值。有什么帮助吗?提前致谢!!

【问题讨论】:

  • 缩进 4 个空格的文本被解析为代码。当且仅当它是代码时,缩进文本 4 个空格。

标签: objective-c


【解决方案1】:

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

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 个零的数组 :) 这很容易检查它是否为空:

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));

希望对您有所帮助。

山姆

【讨论】:

    【解决方案2】:

    首先,请注意“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;
    }
    

    编辑(寻址代码示例):

    getHost 中的str 的长度为 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
    

    【讨论】:

    • 我编辑了我的问题。我认为现在它更清楚了,您可以轻松理解。
    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 2013-03-07
    • 1970-01-01
    • 2018-07-19
    • 2010-12-12
    • 2011-01-23
    • 2011-11-25
    相关资源
    最近更新 更多