2017-06-04 31 views
1

我是一个Objective-C菜鸟,并且我想获取一个chars数组的元素数。我设法找到只有这样:Objective-c - 获得一个数组的元素数

@autoreleasepool { 

    char parola[30]; 
    int c; 

    NSLog(@"Write word:"); 
    scanf("%c",&parola[30]); 

    c = sizeof(parola)/sizeof(parola[0]); 
    NSLog(@"The word has %i letters",c); 

} 
return 0; 

的问题是,它给了我,我在数组声明中指定的长度,而不是指望元素。 有什么想法?

+0

我想你会因为使用'NSString'运行Objective-C而获得更好的运气。 – vitormm

回答

2

你有一些错误。

  1. 您希望用户输入“单词”,即字符串。那就不要使用%c,其中仅扫描一个字符,但%s相反,它扫描一个字符串(请注意,这可能意味着该用户还输入空格或超过29个字符)。

  2. 您存储在阵列之外。该阵列被声明为

    char parola[30]; 
    

这意味着它可以与值0。29.但是您的&parola[30]超出阵列索引(在索引30,其不“存在”)。这不是你想要的。做到这一点:

scanf("%s", parola); 

并希望用户不超过29个字符。

字符串的长度然后可以使用

c = strlen(parola); 

发现原来这变为:

@autoreleasepool { 
    char parola[30]; 
    unsigned long c; 

    NSLog(@"Write word:"); 
    scanf("%s", parola); 

    c = strlen(parola); 
    NSLog(@"The word has %ld letters", c); 

} 
return 0; 

相反的NSLog的,你也可以使用printf

printf("Write word: "); 

printf("The word has %ld letters\n", c); 

这看起来更清洁,为NSLog()始终显示这些额外的相关信息,如

2017-06-04 12:37:25.758802+0200 SOTest[4718:2690388] 

那就是,国际海事组织,难看。适用于日志,但不适合清洁屏幕输出。输出现在变成:

Write word: Tesla 
The word has 5 letters 
Program ended with exit code: 0 
+0

@sulthan:对其他(已删除)答案的评论:“在LLVM上根本不需要使用@autoreleasepool,每个线程默认都会得到一个。”是正确的,但如果从菜单中的Objective-C中启动一个新的控制台程序,那么'@autoreleasepool {}'部分由Xcode生成。它还使用'NSLog()'来打印'“Hello,world!”',而不是'printf()'。 –

+0

它的工作原理!非常感谢 :) – Edo

相关问题