【问题标题】:Using char in C, pointer issue, objective C在 C 中使用 char,指针问题,目标 C
【发布时间】:2011-10-21 01:58:43
【问题描述】:
for (int i=0; i < strlen(chars1); i++) {
    //*buf=chars1[i];
    NSLog(@"Received %c\n", chars1[i]);
    ichar = [ NSString stringWithUTF8String:chars1[i] ];
    NSLog(@"Received ", ichar);
    counter=strlen(chars1)-i;
gnutls_record_send (session, [ichar UTF8String] , counter); 
}

我正在尝试使用此方法向我的服务器发送信息,但我不断收到警告:

警告:传递 'stringWithUTF8String:' 的参数 1 使指针从整数而不进行强制转换

警告是针对这一行的: ichar = [ NSString stringWithUTF8String:chars1[i] ];

无论如何我可以将 chars1[i] 存储到一个临时字符或字符串中,并在我的循环中使用它来发送?

更新

我只是在寻找一种方法来解析从起始字符到结束的 NSString,然后能够在不收到此警告的情况下使用它:

从整数中生成指针而不进行强制转换

【问题讨论】:

    标签: objective-c c pointers char


    【解决方案1】:

    也许这就是你想要的。

    NSString *unicodeString = [NSString stringWithUTF8String:chars1]; 
    for (int i=0; i < [unicodeString length]; i++) {
        NSString *ichar = [unicodeString substringWithRange:NSMakeRange(i, 1)];
        NSLog(@"Received %@", ichar);
        counter=strlen(chars1)-i;
        gnutls_record_send (session, [ichar UTF8String] , counter); 
    }
    

    这将在 chars1 中采用 UTF-8 编码的字符串,并将每个单独字符(本身可能是 1 个或几个字节)的 UTF-8 编码发送到 gnutls_record_send。

    【讨论】:

      【解决方案2】:

      您不能一次解析一个字符的 UTF8(对应关系不是一一对应的)。正确的解决方案取决于您正在解析的协议,该协议应指定如何确定字符串何时开始和结束。按照协议将完成的字符串识别为原始字节数组,然后将其解析为 UTF8 以将其转换为字符串。

      【讨论】:

        【解决方案3】:

        您不需要从 char 数组中获取单个元素并执行所有这些操作。 NSString中有一个类方法,

        + (id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc
        cString
        
            A C array of bytes. The array must end with a NULL character; intermediate NULL characters are not allowed.
        
        //Use this 
            NSString* tempString = [NSString stringWithCString:chars1 encoding:NSUTF8StringEncoding];
        

        【讨论】:

        • gnutls_record_send(会话,[tempString characterAtIndex:i],计数器);创建您显示的字符串后,我在 for 循环中尝试了该方法。这是行不通的。我需要一种逐字符获取字符串的方法。
        • 与其说“它不起作用”,您能说一下发生了什么(错误?警告?异常?错误数据?)以及您预期会发生什么?这将有助于阐明您要实现的目标。
        • 我的错。它仍然对我评论中列出的功能给出相同的警告。在 gnuTLS 函数中使用 [tempString characterAtIndex:i] 的“从整数生成指针而不进行强制转换”。
        • @morningstar 我期望发生的是能够逐个字符地获取并将其发送到我的 for 循环中的 gnuTLS 函数中。就是这样。
        【解决方案4】:

        这个错误很可能是由这一行引起的:

        ichar = [ NSString stringWithUTF8String:chars1[i] ];
        

        NSString:stringWithUTF8String: 需要一个指向字符串的指针,而你只提供了一个字符。

        警告是告诉你你已经在一个指针字段中传递了一个整数(单个字符是一个整数);如果你试图运行这段代码,它会很糟糕,因为它会尝试读取无效的内存。

        UTF-8 是一种多字节编码格式;你不能以这种方式迭代它。考虑将整个字符串放在一个 NSString 中并使用 Cocoa 的 API 对其进行修改,最后在完成后将您希望与 GNUTLS 一起使用的字符串导出回来。

        【讨论】:

          【解决方案5】:

          如果您知道您的字符串是 UTF8,请使用 – initWithUTF8String: 创建一个 NSString 对象,然后如果您需要获取单个字符,请使用 – characterAtIndex:

          其他方法在这里:

          http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFStrings/Articles/AccessingContents.html

          【讨论】:

            【解决方案6】:

            chars[i] 的结果将是单个字符,而不是字符串。您不能将它传递给 NSString stringWithUTFString: 因为它需要一个以 nil 结尾的 C 字符串,而不是单个字符。

            你应该尝试这样的事情:

            ichar = [NSString stringWithCharacters:&chars[i] length:1];
            

            【讨论】:

            • 那行不通。这就像试图通过用字典中的第一个定义替换每个单词来理解一个英语句子。您不能逐个字符地解析 UTF8 字符串。
            • 我认为应该是[NSString stringWithCharacters:&amp;chars[i] length:1]。它是否会起作用将取决于您想要做什么,这还不清楚。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-09
            • 1970-01-01
            • 2017-01-18
            • 2013-06-12
            • 2021-11-26
            • 1970-01-01
            相关资源
            最近更新 更多