[英]Objective C Char Array Issue
大家好,我想以此为目标来学习目标c,这是我学校的一项独立研究,我要练习的一个项目是制作一个计算器程序,用户在其中输入一串数字,运算符将其分解,然后执行计算。 现在,我有了输入,并且我试图让它找到运算符并将它们全部放入一个数组中,以便它可以对它们进行排序以找到操作顺序,并使用索引来找到不同的术语。 但是,当我尝试打印该数组以查看其是否包含字符时,它会输出一些奇怪的符号,例如苹果徽标或颠倒的问号。 我已对我的问题进行了SSCCE -有人知道发生了什么吗?
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSString *calculation;
char str[50] = {0};
int count = 0;
NSLog(@"What would you like to calculate?");
scanf("%s", str);
calculation = [NSString stringWithUTF8String:str];
for (int i = 0; i < [calculation length]; i++) {
NSRange range = NSMakeRange (i, 1);
if([[calculation substringWithRange: range] isEqualToString: @"*"] ||
[[calculation substringWithRange: range] isEqualToString: @"/"])
count++;
}
char operators[count];
for (int i = 0; i < count; i++) {
for (int j = 0; j < [calculation length]; j++) {
NSRange range = NSMakeRange (j, 1);
NSString *s = [s initWithString:[calculation substringWithRange: range]];
if([s isEqualToString:@"*"]){
operators[i] = '*';
break;
}
if([s isEqualToString:@"/"]){
operators[i] = '/';
break;
}
}
NSLog(@"%c", operators[i]);
}
}
return 0;
}
回答有关代码中正在发生什么的问题。 您看到的“怪异符号”是operators[]
数组中内存中的未初始化值。
要查看char []留下垃圾值的原因,请查看代码的这一部分:
...
NSString *s = [s initWithString:[calculation substringWithRange: range]];
if([s isEqualToString:@"*"]){
operators[i] = '*';
break;
}
...
您发送initWithString
到s
。 s
还没有分配。 这导致s
nil
。 并且,由于将isEqualToString:
类的消息发送到nil
即使@"*"
处于该范围内,也基本上不会评估为NO
,您对operators[i]
分配将永远不会发生。
不过,很容易解决,只需将s
分配替换为:
NSString *s = [calculation substringWithRange:range];
您不需要任何花哨的东西。 但是:请使用它的用途。
#import <Foundation/Foundation.h>
int main()
{
NSAutoreleasePool *pool = [NSAutoreleasePool new];
char str[128];
printf("Enter formula:\n");
scanf("%s", str); // this is DAMN unsafe, btw
NSMutableArray *arr = [NSMutableArray array];
char *s = str;
while (*s) {
if (*s == '*') {
[arr addObject:@"*"];
} else if (*s == '/') {
[arr addObject:@"/"];
}
s++;
}
printf("\n");
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@", obj);
}];
[pool drain];
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.