我有应用程序,我从套接字消息收到:“\ 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个字节,这是适合此消息的?你可以在下一张图片中看到我的调试器:
但在 newStr 成员中,我只看到 \ r 。 然后我发送尝试将此消息与我上面编写的代码分开。 当我尝试单独的消息记录器时,显示所有消息而不是 \ r : 谢谢
答案 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