কমান্ড লাইন অ্যাপ্লিকেশনটিতে কীবোর্ড থেকে ইনপুট


94

আমি নতুন অ্যাপল প্রোগ্রামিং ভাষা সুইফটের জন্য কমান্ড লাইন অ্যাপের জন্য কীবোর্ড ইনপুট পাওয়ার চেষ্টা করছি।

আমি ডকসগুলি কোনও স্ক্যান করেই ফেলেছি।

import Foundation

println("What is your name?")
???

কোন ধারনা?

উত্তর:


138

এটি করার সঠিক উপায় হ'ল ব্যবহার করা readLine, সুইফট স্ট্যান্ডার্ড লাইব্রেরি থেকে।

উদাহরণ:

let response = readLine()

প্রবেশ করানো পাঠ্য সহ একটি anচ্ছিক মান দেবে।


4
ধন্যবাদ পাসওয়ার্ড ধরণের ইনপুট পাওয়ার কোনও উপায় আছে কি?
অভিজিৎ গায়কওয়াদ

আমার জন্য, এটি কেবল প্রতিক্রিয়া = শূন্যতার সাথে এই লাইনে নেমেছে। কোন ধারণা সমস্যা কি?
পিটার ওয়েব

4
@ পিটারওয়েব - এক্সকোড টার্মিনালে ভাল কাজ করে, খেলার মাঠে পড়ে :)
এপ্রোফ্রোমিন্ডিয়া

4
রিডলাইন বেশিরভাগ আসল উত্তরের পরে যুক্ত করা হয়েছিল, তাই মনোভাবটি কিছুটা
অনাকাঙ্খিত

4
সুইফট 3, স্লিমজিমের জন্য সংশোধন করা হয়েছে
এজেকিয়েল এলিন

62

আমি সি তে নামা না করে এটি বের করতে সক্ষম হয়েছি:

আমার সমাধানটি নিম্নরূপ:

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
}

4
আমি এটিও পছন্দ করি, এটিও একটি লাইনে সংকুচিত হতে পারে যদি আপনি কোনও ফাংশন সংজ্ঞায়িত করতে না চান, যেমন আপনাকে যদি কোনও প্রোগ্রামে কেবল একবার ইনপুট গ্রহণ করতে হয়:var input = NSString(data: NSFileHandle.fileHandleWithStandardInput().availableData, encoding:NSUTF8StringEncoding)
jcmiller11

4
ফ্লাইতে ব্যবহারকারীর ইনপুট গ্রহণ করার জন্য কি খেলার মাঠে এটি ব্যবহার করার কোনও উপায় আছে?
রব ক্যামেরন

4
আপনি খেলার মাঠে এটি ব্যবহার করতে পারবেন না। আপনাকে সেখানে ভেরিয়েবল ব্যবহার করতে হবে।
চক্ররা

8
মনে রাখবেন আপনি এর সাথে স্ট্রিংয়ে নতুনলাইন পাবেন। তাদের সাথে স্ট্রিপ আউট করুনstring.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
পিকে-এনবি

4
ব্যবহারকারী কোনও অক্ষর মুছে ফেললে, একটি তীর কী ইত্যাদি ব্যবহার করে, আপনি আশ্চর্য অক্ষরগুলিও পাবেন A
ইয়াবাকোস

14

এটি আসলে এতটা সহজ নয়, আপনাকে সিপিআইয়ের সাথে ইন্টারঅ্যাক্ট করতে হবে। এর বিকল্প নেই 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);

ওহ ছেলে - আমি চাই এর চেয়েও তুচ্ছ কিছু ছিল! আমি এটি অক্ষরের একটি স্ট্রিংয়ের জন্য মানিয়ে নিতে অসুবিধে করছি।
চেকার্স

4
ফাংশন সংজ্ঞা সংরক্ষণ করতে একটি "ইউজারআইপুট.এইচ" তৈরি করা ভাল এবং এই ফাইলটি "ক্লিনপুট-ব্রিজিং-শিরোলেখ।" এ অন্তর্ভুক্ত করা ভাল।
অ্যালান ঝিলিয়াং ফেং

7

সুইফট ২.২ হিসাবে সম্পাদনা করুন স্ট্যান্ডার্ড লাইব্রেরি অন্তর্ভুক্ত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) }
}

আমি সুইফটডক মন্তব্যগুলি এবং "পাবলিক" অ্যাক্সেস মডিফায়ার পছন্দ করি, আমি সুইফটে আগে এই ধরণের জিনিসটি দেখিনি, তবে সিসিআর এবং সি-স্ট্রিং সি এবং 8-বিট অক্ষর সেট এবং সুইফটকে থ্রোব্যাক বলে মনে হচ্ছে সব কি ইউনিকোড পাঠ্য সম্পর্কে ... বা কমান্ড-লাইন সরঞ্জামগুলি সমস্ত ASCII ??
কায়ডেল

4
আমি বিশ্বাস করি getchar () ASCII ফেরত দেয়। ইউনিকোড টার্মিনালগুলি এমন একটি সম্পূর্ণ জিনিস যা আমি to
ুকতে চাইনি

7

সাধারণভাবে রিডলাইন () ফাংশনটি কনসোল থেকে ইনপুট স্ক্যান করার জন্য ব্যবহৃত হয়। তবে আপনি "কমান্ড-লাইন সরঞ্জাম" যোগ না করা বা না করা পর্যন্ত এটি সাধারণ আইওএস প্রকল্পে কাজ করবে না

পরীক্ষার জন্য সর্বোত্তম উপায়, আপনি এটি করতে পারেন:

1. একটি ম্যাকোস ফাইল তৈরি করুন

এখানে চিত্র বর্ণনা লিখুন

2. কনসোল থেকে alচ্ছিক স্ট্রিং স্ক্যান করতে রিডলাইন () ফানক ব্যবহার করুন

 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

এখানে চিত্র বর্ণনা লিখুন


5

অন্য বিকল্প হ'ল সঠিক লাইন সম্পাদনা (তীর কীগুলি, ইত্যাদি) এবং 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

3

কনসোল ভিত্তিক অ্যাপ্লিকেশনটিতে ব্যবহারকারীর কাছ থেকে ইনপুট নেওয়ার সহজ উদাহরণ এখানে রয়েছে: আপনি রিডলাইন () ব্যবহার করতে পারেন। প্রথম সংখ্যাটির জন্য কনসোল থেকে ইনপুট নিন এবং তারপরে এন্টার টিপুন। এর পরে নীচের ছবিতে প্রদর্শিত দ্বিতীয় সংখ্যাটির জন্য ইনপুট নিন:

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

এই প্রশ্নের প্রচুর পুরানো উত্তর। সুইফট 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 তেও সমস্যা রয়েছে বলে মনে হয়।


1

আমি Godশ্বরের কাছে কসম খাই .. এই সম্পূর্ণ মৌলিক সমস্যার সমাধান আমাকে বছরের জন্য ছাড়িয়েছে। এটি খুব সহজ .. তবে সেখানে অনেক অস্পষ্ট / খারাপ তথ্য আছে; আশা করি যে আমি শেষ হয়ে গেছে এমন কয়েকটি তলাবিহীন খরগোশের গর্ত থেকে কাউকে বাঁচাতে পারি ...

সুতরাং, এর "কনসোল" এর মাধ্যমে "ব্যবহারকারীর" কাছ থেকে একটি "স্ট্রিং" পাইstdin , আমরা কি করব ?

[NSString.alloc initWithData:
[NSFileHandle.fileHandleWithStandardInput availableData]
                          encoding:NSUTF8StringEncoding];

আপনি যদি এটি পেছনের নতুন লাইন ছাড়া চান তবে কেবল যুক্ত করুন ...

[ ... stringByTrimmingCharactersInSet:
                       NSCharacterSet.newlineCharacterSet];

Ta Da! ᏪℯⅩ ⱥ ᏪℯⅩ


4
সুইফ্ট, ওপি সুইফট বলে।
হেনরিরটটো দুই

4
তিনি বললেন অক্স। এটি সব একই জিনিস সংকলিত! আপনার অভ্যন্তরীণ- ObjC আলিঙ্গন!
অ্যালেক্স গ্রে

4
এমন কিছু লোক আছে যারা সুইফটে লেখেন এবং কখনই উদ্দেশ্য সিটি শিখবেন না এটি এটি কী সংকলন করে তা নয়।
হেনরিরটটউ

1

সুইফট 5: আপনি যদি ক্রমাগত কীবোর্ড থেকে ইনপুট চান না, প্রোগ্রামটি শেষ না করেই, ইনপুট প্রবাহের মতো, নীচের পদক্ষেপগুলি ব্যবহার করুন:

  1. কমনেড লাইন সরঞ্জাম টাইপের নতুন প্রকল্প তৈরি করুন কমান্ড লাইন প্রকল্প

    1. মেইন.সুইফ্ট ফাইলে কোডের নীচে যুক্ত করুন:

      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:")
      }   
      
    2. প্রজেক্টটি রান করুন এবং এক্সকোডে পণ্য ফোল্ডারের অধীনে এক্সিকিউটেবলকে ক্লিক করুন এবং ফাইন্ডারে খুলুন
    3. এটি খোলার জন্য এক্সিকিউটেবলকে ডাবল ক্লিক করুন।
    4. এখন আপনার ইনপুট প্রবেশ করুন। টার্মিনালটি এরকম কিছু দেখবে: এখানে চিত্র বর্ণনা লিখুন

0

যেহেতু এই সমস্যার কোনও অভিনব সমাধান ছিল না, তাই আমি সুইফটে স্ট্যান্ডার্ড ইনপুটটি পড়ার এবং পার্স করার জন্য একটি ক্ষুদ্র শ্রেণি তৈরি করেছি। আপনি এটি এখানে খুঁজে পেতে পারেন

উদাহরণ

পার্স করতে:

+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"
}

স্ট্রিমস্ক্যানার ক্লাস কীভাবে আমদানি করবেন?
টিমোথি সোয়ান

@ টিমোথিসওয়ান, যেমনটি রিডমি ( github.com/shoumikhin/StreamScanner#installation ) এর বিভাগে ব্যাখ্যা করেছেন । সুতরাং মূলত আপনি আপনার প্রকল্পে কেবল স্ট্রিমস্ক্যানার.সুইফ্ট ফাইল যুক্ত করতে পারেন।
শৌমিখিন


0

এটি xCode v6.2 এ কাজ করে, আমি মনে করি এটি সুইফট v1.2

func input() -> String {
    var keyboard = NSFileHandle.fileHandleWithStandardInput()
    var inputData = keyboard.availableData
    return NSString(data: inputData, encoding:NSUTF8StringEncoding)! as String
}

0

আপনি যদি স্থানটি পৃথক স্ট্রিং পড়তে চান এবং সঙ্গে সঙ্গে স্ট্রিংটিকে একটি অ্যারেতে বিভক্ত করেন, আপনি এটি করতে পারেন:

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)")

0

এক্সকোডে রিডলাইন () ফাংশনটি চালিত হলে, ডিবাগ কনসোলটি ইনপুটটির জন্য অপেক্ষা করে। ইনপুটটি শেষ হয়ে যাওয়ার পরে বাকী কোডটি আবার চালু করা হবে।

    let inputStr = readLine()
    if let inputStr = inputStr {
        print(inputStr)
    }

0

এই প্রশ্নের শীর্ষস্থানীয় উত্তরটি কমান্ড লাইন থেকে ব্যবহারকারীদের ইনপুট নিতে রিডলাইন () পদ্ধতিটি ব্যবহার করার পরামর্শ দেয়। তবে, আমি নোট করতে চাই যে আপনি এটি ব্যবহার করা প্রয়োজন! অপারেটর যখন এই পদ্ধতিটিকে বিকল্পের পরিবর্তে স্ট্রিং ফিরিয়ে আনার জন্য কল করে:

var response = readLine()!

জোর-মোড়ক কেন, readLine()কোনও কারণে alচ্ছিক প্রত্যাবর্তন করে, তাই জোর-আন-মোড়ক করা এটি অনিরাপদ এবং সত্যই উদাহরণে কিছু যুক্ত করে না।
ক্যামসফট

0
var a;
scanf("%s\n", n);

আমি এটি ওজজিতে পরীক্ষা করে দেখেছি এবং এটি কার্যকর হবে।


-1

জেনাডু বাস্তবায়নের বিষয়ে আমি কেবল মন্তব্য করতে চেয়েছিলাম (আমার কাছে পর্যাপ্ত রেপস নেই), কারণ 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)")
    }
}

-1

আমি এখন নিম্নলিখিতটি ব্যবহার করে সুইফটে কীবোর্ড ইনপুট পেতে সক্ষম হয়েছি:

আমার মেইন.সুইফ্ট ফাইলে আমি একটি ভেরিয়েবল 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 বা এর মতো কিছু।

আশা করি আমি সাহায্য করতে পারি,

সম্পাদনা করুন: সি এর মাধ্যমে স্ট্রিং ইনপুট পাওয়া সম্ভব নয় কারণ এখানে আমি সিআইএনটি -> সিফের পূর্ণসংখ্যার ধরন ব্যবহার করছি, সুইফের নয়। সি চর * এর জন্য কোনও সমতুল্য সুইফট টাইপ নেই। সুতরাং স্ট্রিং স্ট্রিংয়ে রূপান্তরযোগ্য নয়। তবে স্ট্রিং ইনপুট পেতে এখানে প্রায় যথেষ্ট সমাধান রয়েছে।

রাউল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.