আমি নতুন অ্যাপল প্রোগ্রামিং ভাষা সুইফটের জন্য কমান্ড লাইন অ্যাপের জন্য কীবোর্ড ইনপুট পাওয়ার চেষ্টা করছি।
আমি ডকসগুলি কোনও স্ক্যান করেই ফেলেছি।
import Foundation
println("What is your name?")
???
কোন ধারনা?
উত্তর:
এটি করার সঠিক উপায় হ'ল ব্যবহার করা readLine
, সুইফট স্ট্যান্ডার্ড লাইব্রেরি থেকে।
উদাহরণ:
let response = readLine()
প্রবেশ করানো পাঠ্য সহ একটি anচ্ছিক মান দেবে।
আমি সি তে নামা না করে এটি বের করতে সক্ষম হয়েছি:
আমার সমাধানটি নিম্নরূপ:
func input() -> String {
var keyboard = NSFileHandle.fileHandleWithStandardInput()
var inputData = keyboard.availableData
return NSString(data: inputData, encoding:NSUTF8StringEncoding)!
}
এক্সকোডের আরও সাম্প্রতিক সংস্করণগুলিতে স্পষ্টত টাইপেকাস্টের প্রয়োজন (এক্সকোড 6.4 এ কাজ করে):
func input() -> String {
var keyboard = NSFileHandle.fileHandleWithStandardInput()
var inputData = keyboard.availableData
return NSString(data: inputData, encoding:NSUTF8StringEncoding)! as String
}
var input = NSString(data: NSFileHandle.fileHandleWithStandardInput().availableData, encoding:NSUTF8StringEncoding)
string.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
এটি আসলে এতটা সহজ নয়, আপনাকে সিপিআইয়ের সাথে ইন্টারঅ্যাক্ট করতে হবে। এর বিকল্প নেই scanf
। আমি একটি ছোট উদাহরণ তৈরি করেছি:
main.swift
import Foundation
var output: CInt = 0
getInput(&output)
println(output)
ব্যবহারকারীর ইনপুট
#include <stdio.h>
void getInput(int *output) {
scanf("%i", output);
}
ক্লিনপুট-ব্রিজিং-শিরোনাম
void getInput(int *output);
সুইফট ২.২ হিসাবে সম্পাদনা করুন স্ট্যান্ডার্ড লাইব্রেরি অন্তর্ভুক্তreadLine
। আমি সুইফটটি মার্কডাউন ডকের মন্তব্যগুলিতে স্যুইচ করে নোট করব। Originalতিহাসিক প্রসঙ্গে আমার আসল উত্তরটি ছেড়ে দেওয়া।
কেবল সম্পূর্ণতার জন্য, এখানে একটি সুইফ্ট বাস্তবায়ন readln
আমি ব্যবহার করছি । আপনি পড়তে চান সর্বাধিক সংখ্যক বাইট (যা স্ট্রিংয়ের দৈর্ঘ্য হতে পারে এবং নাও হতে পারে) নির্দেশ করতে এটিতে একটি alচ্ছিক প্যারামিটার রয়েছে।
এটি সুইফটডক মন্তব্যের যথাযথ ব্যবহারকেও প্রদর্শন করে - সুইফট একটি <প্রকল্প>। সুইফটডোক ফাইল তৈরি করবে এবং এক্সকোড এটি ব্যবহার করবে।
///reads a line from standard input
///
///:param: max specifies the number of bytes to read
///
///:returns: the string, or nil if an error was encountered trying to read Stdin
public func readln(max:Int = 8192) -> String? {
assert(max > 0, "max must be between 1 and Int.max")
var buf:Array<CChar> = []
var c = getchar()
while c != EOF && c != 10 && buf.count < max {
buf.append(CChar(c))
c = getchar()
}
//always null terminate
buf.append(CChar(0))
return buf.withUnsafeBufferPointer { String.fromCString($0.baseAddress) }
}
সাধারণভাবে রিডলাইন () ফাংশনটি কনসোল থেকে ইনপুট স্ক্যান করার জন্য ব্যবহৃত হয়। তবে আপনি "কমান্ড-লাইন সরঞ্জাম" যোগ না করা বা না করা পর্যন্ত এটি সাধারণ আইওএস প্রকল্পে কাজ করবে না ।
পরীক্ষার জন্য সর্বোত্তম উপায়, আপনি এটি করতে পারেন:
import Foundation
print("Please enter some input\n")
if let response = readLine() {
print("output :",response)
} else {
print("Nothing")
}
Please enter some input
Hello, World
output : Hello, World
Program ended with exit code: 0
অন্য বিকল্প হ'ল সঠিক লাইন সম্পাদনা (তীর কীগুলি, ইত্যাদি) এবং history চ্ছিক ইতিহাস সমর্থনের জন্য লিবিডিট লিঙ্ক করা । আমি যে প্রকল্পটি শুরু করছি তার জন্য এটি চেয়েছিলাম এবং আমি কীভাবে এটি সেট আপ করব তার একটি বেসিক উদাহরণ রেখেছি ।
দ্রুত ব্যবহার থেকে
let prompt: Prompt = Prompt(argv0: C_ARGV[0])
while (true) {
if let line = prompt.gets() {
print("You typed \(line)")
}
}
ওবিজেসি র্যাপারটি লিবিডিট প্রকাশ করতে
#import <histedit.h>
char* prompt(EditLine *e) {
return "> ";
}
@implementation Prompt
EditLine* _el;
History* _hist;
HistEvent _ev;
- (instancetype) initWithArgv0:(const char*)argv0 {
if (self = [super init]) {
// Setup the editor
_el = el_init(argv0, stdin, stdout, stderr);
el_set(_el, EL_PROMPT, &prompt);
el_set(_el, EL_EDITOR, "emacs");
// With support for history
_hist = history_init();
history(_hist, &_ev, H_SETSIZE, 800);
el_set(_el, EL_HIST, history, _hist);
}
return self;
}
- (void) dealloc {
if (_hist != NULL) {
history_end(_hist);
_hist = NULL;
}
if (_el != NULL) {
el_end(_el);
_el = NULL;
}
}
- (NSString*) gets {
// line includes the trailing newline
int count;
const char* line = el_gets(_el, &count);
if (count > 0) {
history(_hist, &_ev, H_ENTER, line);
return [NSString stringWithCString:line encoding:NSUTF8StringEncoding];
}
return nil;
}
@end
কনসোল ভিত্তিক অ্যাপ্লিকেশনটিতে ব্যবহারকারীর কাছ থেকে ইনপুট নেওয়ার সহজ উদাহরণ এখানে রয়েছে: আপনি রিডলাইন () ব্যবহার করতে পারেন। প্রথম সংখ্যাটির জন্য কনসোল থেকে ইনপুট নিন এবং তারপরে এন্টার টিপুন। এর পরে নীচের ছবিতে প্রদর্শিত দ্বিতীয় সংখ্যাটির জন্য ইনপুট নিন:
func solveMefirst(firstNo: Int , secondNo: Int) -> Int {
return firstNo + secondNo
}
let num1 = readLine()
let num2 = readLine()
var IntNum1 = Int(num1!)
var IntNum2 = Int(num2!)
let sum = solveMefirst(IntNum1!, secondNo: IntNum2!)
print(sum)
এই প্রশ্নের প্রচুর পুরানো উত্তর। সুইফট 2+ হিসাবে সুইফ্ট স্ট্যান্ডার্ড লাইব্রেরিতে রিডলাইন () ফাংশন রয়েছে। এটি একটি ptionচ্ছিক প্রত্যাবর্তন করবে তবে ইওএফ পৌঁছে গেলে তা কেবল শ্যুট হবে, যা কীবোর্ড থেকে ইনপুট পাওয়ার সময় ঘটবে না যাতে নিরাপদে সেই পরিস্থিতিতে দৃ .়তার সাথে মোড়কে মোড়ানো যায়। যদি ব্যবহারকারী কোনও কিছু প্রবেশ না করে তবে এর (মোড়কযুক্ত) মানটি একটি খালি স্ট্রিং হবে। এখানে একটি ছোট্ট ইউটিলিটি ফাংশন যা কমপক্ষে একটি অক্ষর প্রবেশ না করা অবধি ব্যবহারকারীকে অনুরোধ করতে পুনরাবৃত্তি ব্যবহার করে:
func prompt(message: String) -> String {
print(message)
let input: String = readLine()!
if input == "" {
return prompt(message: message)
} else {
return input
}
}
let input = prompt(message: "Enter something!")
print("You entered \(input)")
নোট করুন যে অন্যান্য উত্তরে প্রস্তাবিত হিসাবে কিছু প্রবেশ করানো হয়েছে কিনা তা পরীক্ষা করতে alচ্ছিক বাঁধাই (যদি ইনপুট = রিডলাইন () ব্যবহার করে তা পছন্দসই প্রভাব ফেলবে না, কারণ এটি কখনই শূন্য হবে না এবং কমপক্ষে কীবোর্ড ইনপুট গ্রহণ করার সময় "" থাকবে না।
এটি কোনও খেলার মাঠ বা অন্য কোনও পরিবেশে কাজ করবে না যেখানে আপনার কমান্ড প্রম্পটে অ্যাক্সেস নেই। এটি কমান্ড-লাইন REPL তেও সমস্যা রয়েছে বলে মনে হয়।
আমি Godশ্বরের কাছে কসম খাই .. এই সম্পূর্ণ মৌলিক সমস্যার সমাধান আমাকে বছরের জন্য ছাড়িয়েছে। এটি খুব সহজ .. তবে সেখানে অনেক অস্পষ্ট / খারাপ তথ্য আছে; আশা করি যে আমি শেষ হয়ে গেছে এমন কয়েকটি তলাবিহীন খরগোশের গর্ত থেকে কাউকে বাঁচাতে পারি ...
সুতরাং, এর "কনসোল" এর মাধ্যমে "ব্যবহারকারীর" কাছ থেকে একটি "স্ট্রিং" পাইstdin
, আমরা কি করব ?
[NSString.alloc initWithData:
[NSFileHandle.fileHandleWithStandardInput availableData]
encoding:NSUTF8StringEncoding];
আপনি যদি এটি পেছনের নতুন লাইন ছাড়া চান তবে কেবল যুক্ত করুন ...
[ ... stringByTrimmingCharactersInSet:
NSCharacterSet.newlineCharacterSet];
Ta Da!
ᏪℯⅩ ⱥ ᏪℯⅩ
সুইফট 5: আপনি যদি ক্রমাগত কীবোর্ড থেকে ইনপুট চান না, প্রোগ্রামটি শেষ না করেই, ইনপুট প্রবাহের মতো, নীচের পদক্ষেপগুলি ব্যবহার করুন:
কমনেড লাইন সরঞ্জাম টাইপের নতুন প্রকল্প তৈরি করুন
মেইন.সুইফ্ট ফাইলে কোডের নীচে যুক্ত করুন:
var inputArray = [String]()
while let input = readLine() {
guard input != "quit" else {
break
}
inputArray.append(input)
print("You entered: \(input)")
print(inputArray)
print("Enter a word:")
}
যেহেতু এই সমস্যার কোনও অভিনব সমাধান ছিল না, তাই আমি সুইফটে স্ট্যান্ডার্ড ইনপুটটি পড়ার এবং পার্স করার জন্য একটি ক্ষুদ্র শ্রেণি তৈরি করেছি। আপনি এটি এখানে খুঁজে পেতে পারেন ।
উদাহরণ
পার্স করতে:
+42 st_ring!
-0.987654321 12345678900
.42
তুমি কর:
let stdin = StreamScanner.standardInput
if
let i: Int = stdin.read(),
let s: String = stdin.read(),
let d: Double = stdin.read(),
let i64: Int64 = stdin.read(),
let f: Float = stdin.read()
{
print("\(i) \(s) \(d) \(i64) \(f)") //prints "42 st_ring! -0.987654321 12345678900 0.42"
}
এটি xCode v6.2 এ কাজ করে, আমি মনে করি এটি সুইফট v1.2
func input() -> String {
var keyboard = NSFileHandle.fileHandleWithStandardInput()
var inputData = keyboard.availableData
return NSString(data: inputData, encoding:NSUTF8StringEncoding)! as String
}
আপনি যদি স্থানটি পৃথক স্ট্রিং পড়তে চান এবং সঙ্গে সঙ্গে স্ট্রিংটিকে একটি অ্যারেতে বিভক্ত করেন, আপনি এটি করতে পারেন:
var arr = readLine()!.characters.split(" ").map(String.init)
যেমন
print("What is your full name?")
var arr = readLine()!.characters.split(" ").map(String.init)
var firstName = ""
var middleName = ""
var lastName = ""
if arr.count > 0 {
firstName = arr[0]
}
if arr.count > 2 {
middleName = arr[1]
lastName = arr[2]
} else if arr.count > 1 {
lastName = arr[1]
}
print("First Name: \(firstName)")
print("Middle Name: \(middleName)")
print("Last Name: \(lastName)")
এই প্রশ্নের শীর্ষস্থানীয় উত্তরটি কমান্ড লাইন থেকে ব্যবহারকারীদের ইনপুট নিতে রিডলাইন () পদ্ধতিটি ব্যবহার করার পরামর্শ দেয়। তবে, আমি নোট করতে চাই যে আপনি এটি ব্যবহার করা প্রয়োজন! অপারেটর যখন এই পদ্ধতিটিকে বিকল্পের পরিবর্তে স্ট্রিং ফিরিয়ে আনার জন্য কল করে:
var response = readLine()!
readLine()
কোনও কারণে alচ্ছিক প্রত্যাবর্তন করে, তাই জোর-আন-মোড়ক করা এটি অনিরাপদ এবং সত্যই উদাহরণে কিছু যুক্ত করে না।
var a;
scanf("%s\n", n);
আমি এটি ওজজিতে পরীক্ষা করে দেখেছি এবং এটি কার্যকর হবে।
জেনাডু বাস্তবায়নের বিষয়ে আমি কেবল মন্তব্য করতে চেয়েছিলাম (আমার কাছে পর্যাপ্ত রেপস নেই), কারণ CChar
ওএস এক্সে রয়েছে Int8
, এবং আপনি অ্যারে যুক্ত করার সময় সুইফ্ট মোটেই পছন্দ করেন নাgetchar()
ইউটিএফ -8 এর অংশগুলি ফেরত ।
আমি UInt8
পরিবর্তে একটি অ্যারে ব্যবহার করছি , এবং এটি দুর্দান্ত কাজ String.fromCString
করে UInt8
এবং ইউটিএফ -8 এ ঠিক সূক্ষ্ম রূপান্তর করে ।
যাইহোক আমি এটি এটি কিভাবে
func readln() -> (str: String?, hadError: Bool) {
var cstr: [UInt8] = []
var c: Int32 = 0
while c != EOF {
c = getchar()
if (c == 10 || c == 13) || c > 255 { break }
cstr.append(UInt8(c))
}
cstr.append(0)
return String.fromCStringRepairingIllFormedUTF8(UnsafePointer<CChar>(cstr))
}
while true {
if let mystring = readln().str {
println(" > \(mystring)")
}
}
আমি এখন নিম্নলিখিতটি ব্যবহার করে সুইফটে কীবোর্ড ইনপুট পেতে সক্ষম হয়েছি:
আমার মেইন.সুইফ্ট ফাইলে আমি একটি ভেরিয়েবল i ঘোষণা করে এর জন্য getInt () ফাংশনটি অর্পণ করেছি যা আমি উদ্দেশ্য সিতে সংজ্ঞায়িত করেছি যেখানে তথাকথিত ব্রিজিং শিরোলেখার মাধ্যমে আমি getInt এর জন্য ফাংশন প্রোটোটাইপ ঘোষণা করেছি আমি main.swift এর সাথে লিঙ্ক করতে পারি। ফাইলগুলি এখানে:
main.swift:
var i: CInt = GetInt()
println("Your input is \(i) ");
ব্রিজিং শিরোনাম:
#include "obj.m"
int GetInt();
obj.m:
#import <Foundation/Foundation.h>
#import <stdio.h>
#import <stdlib.h>
int GetInt()
{
int i;
scanf("%i", &i);
return i;
}
Obj.m তে সি স্ট্যান্ডার্ড আউটপুট এবং ইনপুট, স্টিডিয়ো এইচ পাশাপাশি সি স্ট্যান্ডার্ড লাইব্রেরি stdlib.h অন্তর্ভুক্ত করা সম্ভব যা আপনাকে সি-তে অবজেক্টিভ-সি তে প্রোগ্রাম করতে সক্ষম করে, যার অর্থ এতে অন্তর্ভুক্ত করার প্রয়োজন নেই means ব্যবহারকারীর মতো একটি বাস্তব সুইফ্ট ফাইল .c বা এর মতো কিছু।
আশা করি আমি সাহায্য করতে পারি,
সম্পাদনা করুন: সি এর মাধ্যমে স্ট্রিং ইনপুট পাওয়া সম্ভব নয় কারণ এখানে আমি সিআইএনটি -> সিফের পূর্ণসংখ্যার ধরন ব্যবহার করছি, সুইফের নয়। সি চর * এর জন্য কোনও সমতুল্য সুইফট টাইপ নেই। সুতরাং স্ট্রিং স্ট্রিংয়ে রূপান্তরযোগ্য নয়। তবে স্ট্রিং ইনপুট পেতে এখানে প্রায় যথেষ্ট সমাধান রয়েছে।
রাউল