[英]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.