2010-07-10 44 views
11

Tôi muốn người dùng nhập chuỗi và sau đó gán đầu vào cho một NSString. Ngay bây giờ mã của tôi trông giống như sau:Sử dụng scanf với NSStrings

NSString *word; 

scanf("%s", &word); 

Trả lời

7

scanf không hoạt động với bất kỳ loại đối tượng nào. Nếu bạn có một chuỗi C và muốn tạo một NSString từ nó, hãy sử dụng -[NSString initWithBytes:length:encoding:].

+0

Bạn tạo chuỗi c bằng cách nào? Bạn có thể chỉnh sửa mã của tôi để chỉ cho tôi cách thực hiện không. – Omar

+0

Chuỗi C là một mảng các ký tự, do đó bạn chỉ cần viết 'char word [100]'. –

8

Chức năng scanf đọc vào một chuỗi C (thực sự là một mảng của char), như thế này:

char word[40]; 

int nChars = scanf("%39s", word); // read up to 39 chars (leave room for NUL) 

Bạn có thể chuyển đổi một mảng char vào NSString như thế này:

NSString* word2 = [NSString stringWithBytes:word 
            length:nChars 
            encoding:NSUTF8StringEncoding]; 

Tuy nhiên scanf chỉ hoạt động với các chương trình bảng điều khiển (dòng lệnh). Nếu bạn đang cố gắng để có được đầu vào trên một thiết bị Mac hoặc iOS thì scanf không phải là những gì bạn muốn sử dụng để có được đầu vào của người dùng.

+0

Liệu 'scanf' có hoạt động với' char * 'không? Tôi không muốn giới hạn đầu vào bằng cách sử dụng mảng char cố định. – raffian

+0

@SAFX: có, nhưng có rủi ro khi sử dụng scanf, xem [chi tiết tại đây] (http://stackoverflow.com/q/2430303/154803). Đó là lý do tại sao tôi sử dụng một bộ đệm kích thước cố định và giới hạn độ dài trong scanf. – progrmr

+0

@progrmr Có lẽ đây là lỗi thời? Tôi nhận được 'Không biết phương thức lớp' cho cuộc gọi stringWithBytes. – sunny

1

có, nhưng sscanf thực hiện và có thể là giải pháp tốt cho phân tích cú pháp NSString phức tạp.

4

Đây là cách tôi muốn làm điều đó:

char word [40]; 
scanf("%s",word); 

NSString * userInput = [[NSString alloc] initWithCString: word encoding: NSUTF8StringEncoding]; 
+0

LƯU Ý: Bạn không cần phải đặt '&' Vì từ không phải là một con trỏ, và là mảng ký tự thực tế. – ManOx

7

scanf không làm việc với NSString như scanf không hoạt động trên các đối tượng. Nó chỉ hoạt động trên các kiểu dữ liệu nguyên thủy như:

  1. int
  2. phao
  3. BOOL
  4. char

Phải làm gì?

Về mặt kỹ thuật, chuỗi được tạo thành từ chuỗi ký tự riêng lẻ. Vì vậy, để chấp nhận đầu vào chuỗi, bạn có thể đọc trong chuỗi các ký tự và chuyển đổi nó thành một chuỗi.

sử dụng:

[NSString stringWithCString:cstring encoding:1]; 

Dưới đây là một ví dụ làm việc:

NSLog(@"What is the first name?"); 
char cstring[40]; 
scanf("%s", cstring); 

firstName = [NSString stringWithCString:cstring encoding:1]; 

Dưới đây là một lời giải thích của các mã trên, bình luận của bình luận:

  1. Bạn khai báo một biến gọi là cstring để giữ 40 ​​ký tự.
  2. Sau đó, bạn yêu cầu scanf mong đợi danh sách các ký tự bằng cách sử dụng trình định dạng định dạng% s.
  3. Cuối cùng, bạn tạo một đối tượng NSString từ danh sách các nhân vật đã được đọc trong

chạy dự án của bạn. nếu bạn nhập một từ và nhấn Enter, chương trình sẽ in ra cùng một từ bạn đã nhập. Chỉ cần đảm bảo từ ít hơn 40 ký tự; nếu bạn nhập nhiều hơn, bạn có thể khiến chương trình bị lỗi - bạn có thể tự mình thử nghiệm!:]

Lấy từ: RW.

+2

Có lẽ tốt hơn nếu bạn sử dụng 'NSUTF8StringEncoding' làm tùy chọn mã hóa, không phải là' 1'. –

+0

Làm cách nào để xử lý dòng mới và khoảng trắng? – anoop4real

0

Giải pháp đơn giản là

char word[40]; 
scanf("%39s", word); 
NSString* word2 = [NSString stringWithUTF8String:word]; 
1

lẽ điều này sẽ làm việc cho bạn vì nó chấp nhận chuỗi với không gian là tốt.

NSLog(@"Enter The Name Of State"); 
char name[20]; 
gets(name); 
NSLog(@"%s",name); 
0

Lớp NSFileHandle là trình bao bọc hướng đối tượng cho bộ mô tả tệp. Đối với các tệp, bạn có thể đọc, viết và tìm kiếm trong tệp.

NSFileHandle *inputFile = [NSFileHandle fileHandleWithStandardInput]; 
NSData *inputData = [inputFile availableData]; 
NSString *word = [[NSString alloc]initWithData:inputData encoding:NSUTF8StringEncoding]; 
Các vấn đề liên quan