NSArray元素到NSString

时间:2013-03-17 18:26:50

标签: ios nsstring nsarray

我有应用程序,我从套接字消息收到:“\ r \ nIDLE | 03/17/2013 19:48 \ n”。我将此消息转换为UTF8字符串,代码为:

NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

然后我尝试将命令和时间与此字符串分开:

NSArray *nums = [command componentsSeparatedByString:[NSString stringWithFormat:@"%c", (char)13]];
NSLog(@"First separate = %@", nums);
if ([nums count] == 3)
{
    NSArray *nums1 = [[nums objectAtIndex:1] componentsSeparatedByString:@"|"];
    NSLog(@"second separate = %@", nums1);
    if ([nums1 count] == 2)
    {
        NSString* strState = [(NSString *)[nums1 objectAtIndex:0] description];
        NSLog(@"State = %@", strState);

        ...
    }
}
我在下面看到的日志中

    First separate = (
    "IDLE|03/17/2013 19:48",
    "\n"
second separate = (
    "IDLE",
    "03/17/2013 19:48"
State = I

在0个元素中第二次分离后,我有 IDLE 文本,但是当我尝试获取此文本时我 strState 变量,我只看到此文本的第一个字符。 任何人都可以帮我完全掌握这个元素吗?

谢谢。

UPDATE1 正如我之前所说,我从套接字消息中得到:“\ r \ nIDLE | 03/17/2013 19:48 \ n” 我确定服务器发给我这条消息。 在Socket读取回调中,我使用下一个代码来读取此消息:

int result = CFReadStreamRead(_inputStream, (UInt8*)[data mutableBytes], length);
NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

这里app读取50个字节,这是适合此消息的?你可以在下一张图片中看到我的调试器: Debugger in the socket

但在 newStr 成员中,我只看到 \ r 。 然后我发送尝试将此消息与我上面编写的代码分开。 当我尝试单独的消息记录器时,显示所有消息而不是 \ r array after separate 谢谢

2 个答案:

答案 0 :(得分:0)

您是否考虑过使用sscanf()?

  char command[COMMAND_SIZE_LIMIT];   
  char date[DATE_SIZE_LIMIT];
  char time[TIME_SIZE_LIMIT];

  sscanf (input, "\r\n%[^|]%*[|]%s%s\n", command, date, time);

(注意:上面是示例代码;如果扫描的字符串具有超大的命令或日期时间子字符串,则会出现安全问题。)

# test
ebg@ebg$ ./foo
Input: '
IDLE|03/17/2013 19:48
'
Command: 'IDLE'
Date: '03/17/2013'
Time: '19:48'

很容易转换NSString< ==> C字符串。

答案 1 :(得分:0)

使用-[NSString stringByTrimmingCharactersInSet:]方法有一种相当简单的方法可以实现您想要的效果。通过空格和换行字符集,您可以修剪字符串中的前导和尾随空格和换行符,然后只需要对componentsSeparatedByString:进行一次调用。

NSString *raw = @"\r\nIDLE|03/17/2013 19:48\n";
NSString *trimmedString = [raw stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSArray *components = [trimmedString componentsSeparatedByString:@"|"];
NSString *command = components[0];
NSString *time = components[1];
NSLog(@"command = %@, time = %@",command,time);

此代码产生以下输出:

command = IDLE, time = 03/17/2013 19:48