2012-12-01 26 views
6

मैं मैन्युअल रूप से पहले खाली स्थान के दर्ज किए बिनाएडीए: एक स्ट्रिंग (1..10) के लिए उपयोगकर्ता इनपुट हो रही है और रिक्त स्थान को

subtype String10 is String(1..10); 

और मैं इसे करने के लिए कीबोर्ड इनपुट प्राप्त करने का प्रयास कर रहा हूँ को परिभाषित किया है के साथ आराम भरने प्रवेश मारना मैंने get_line() की कोशिश की लेकिन किसी कारण से यह वास्तव में get put() कमांड को आउटपुट करने से पहले इनपुट के लिए इंतजार नहीं करेगा, और मुझे यह भी लगता है कि यह पहले स्ट्रिंग में जो भी था उसे छोड़ देगा और इसे सफेद स्पेस से भर नहीं देगा।

मुझे पता है और Bounded_String और Unbounded_String का उपयोग किया है, लेकिन मुझे आश्चर्य है कि यह काम करने का कोई तरीका है या नहीं।

मैं इसके लिए एक समारोह बनाने की कोशिश की है:

--getString10-- 
procedure getString10(s : string10) is 
    c : character; 
    k : integer; 
begin 
    for i in integer range 1..10 loop 
     get(c); 
     if Ada.Text_IO.End_Of_Line = false then 
     s(i) := c; 
     else 
     k := i; 
     exit; 
     end if; 
    end loop; 

    for i in integer range k..10 loop 
     s(i) := ' '; 
    end loop; 
end getString10; 

लेकिन, यहाँ, मुझे पता है s(i) काम नहीं करता है, और मुझे नहीं लगता

"if Ada.Text_IO.End_Of_Line = false then" 

क्या करता है मुझे उम्मीद है कि यह या तो करेगा। यह सिर्फ एक प्लेसहोल्डर है जबकि मैं इसे करने का वास्तविक तरीका ढूंढता हूं।

मैं अब कुछ घंटों के लिए खोज रहा हूं, लेकिन एडी दस्तावेज अन्य भाषाओं के रूप में उपलब्ध या स्पष्ट नहीं है। मुझे स्ट्रिंग प्राप्त करने के बारे में बहुत कुछ मिला है, लेकिन जो मैं ढूंढ रहा हूं वह नहीं।

+1

'सत्य' और 'झूठी' के समानता तुलना विशेष रूप से स्पष्ट नहीं हैं। 'अगर Ada.Text_IO.End_Of_Line = false तो' की बजाय, बस लिखें, अगर Ada.Text_IO.End_Of_Line तो 'लिखें। (हालांकि मुझे नहीं लगता कि आपको वैसे भी 'End_Of_Line' का उपयोग करने की आवश्यकता है।) –

उत्तर

6

Get_Line पर कॉल करने से पहले बस रिक्त स्थान के साथ स्ट्रिंग को पूर्व-प्रारंभ करें। जब मैं इसे चलाने

with Ada.Text_IO; use Ada.Text_IO; 
procedure Foo is 
    S: String(1 .. 10) := (others => ' '); 
    Last: Integer; 
begin 
    Put("Enter S: "); 
    Get_Line(S, Last); 
    Put_Line("S = """ & S & """"); 
    Put_Line("Last = " & Integer'Image(Last)); 
end Foo; 

और आउटपुट मैं:

यह एक छोटा सा कार्यक्रम मैं सिर्फ एक साथ फेंक दिया है

Enter S: hello 
S = "hello  " 
Last = 5 

एक और संभावना है, बजाय पूर्व आरंभ स्ट्रिंग, करने के लिए है के बाद रिक्त स्थान के शेष के सेट Get_Line कॉल:

with Ada.Text_IO; use Ada.Text_IO; 
procedure Foo is 
    S: String(1 .. 10); 
    Last: Integer; 
begin 
    Put("Enter S: "); 
    Get_Line(S, Last); 
    S(Last+1 .. S'Last) := (others => ' '); 
    Put_Line("S = """ & S & """"); 
    Put_Line("Last = " & Integer'Image(Last)); 
end Foo; 

बहुत बड़े सरणी के लिए, बाद वाला दृष्टिकोण अधिक कुशल हो सकता है क्योंकि यह स्ट्रिंग के प्रारंभिक भाग को दो बार असाइन नहीं करता है, लेकिन व्यवहार में अंतर महत्वपूर्ण होने की संभावना नहीं है।

+0

धन्यवाद। मुझे यकीन नहीं है कि मैंने इसे पहले से शुरू करने के बारे में क्यों नहीं सोचा था। क्या "(अन्य => '' ')" बस रिक्त स्थान के साथ एस भरें? मैंने अभी तक संरचनाओं के मामले में इसका उपयोग किया है, इसलिए मुझे यकीन नहीं है कि यह और क्या करता है। वास्तव में प्रश्न को संबोधित करने के लिए – user1279914

+2

+1। :-) @ उपयोगकर्ता 1279 9 14: यह भी देखें [* 4.3.3 ऐरे समेकित *] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-4-3-3.html)। – trashgod

+1

हां, एक सरणी में एक 'अन्य' खंड कुल सभी तत्वों को संदर्भित करता है जो अन्यथा निर्दिष्ट नहीं हैं। यदि केवल * एक * अन्य 'खंड है, तो यह सरणी के सभी तत्वों को संदर्भित करता है। –

2

वैकल्पिक रूप से, function Get_Line का उपयोग करें, जो एक निश्चित लंबाई String देता है जिसमें "1 की निचली सीमा और वर्णों की संख्या की ऊपरी सीमा है।" उदाहरण Line_By_Line फ़ाइल से पढ़ने वाली भिन्नता का उपयोग करता है। यदि आवश्यकता हो, तो स्ट्रिंग को Target स्ट्रिंग पर कॉपी करने के लिए आप procedure Move का उपयोग कर सकते हैं; प्रक्रिया स्वचालित रूप से डिफ़ॉल्ट रूप से अंतरिक्ष के साथ पैड।

परिशिष्ट: उदाहरण के लिए, Line_Test पैड * के साथ पैड और चुपचाप दाईं ओर लंबी लाइनों को छोटा कर देता है।

with Ada.Integer_Text_IO; 
with Ada.Strings.Fixed; 
with Ada.Text_IO; 

procedure Line_Test is 
    Line_Count : Natural := 0; 
    Buffer: String(1 .. 10); 
begin 
    while not Ada.Text_IO.End_Of_File loop 
     declare 
     Line : String := Ada.Text_IO.Get_Line; 
     begin 
     Line_Count := Line_Count + 1; 
     Ada.Integer_Text_IO.Put(Line_Count, 0); 
     Ada.Text_IO.Put_Line(": " & Line); 
     Ada.Strings.Fixed.Move(
      Source => Line, 
      Target => Buffer, 
      Drop => Ada.Strings.Right, 
      Justify => Ada.Strings.Left, 
      Pad  => '*'); 
     Ada.Integer_Text_IO.Put(Line_Count, 0); 
     Ada.Text_IO.Put_Line(": " & Buffer); 
     end; 
    end loop; 
end Line_Test; 
+0

मैंने get_line() की कोशिश की, लेकिन कुछ कारणों से इनपुट की प्रतीक्षा करने से पहले यह निम्नलिखित put() को प्रिंट करता रहा।मैं वास्तव में कीबोर्ड से इनपुट प्राप्त कर रहा हूं, लेकिन कभी-कभी इनपुट फ़ाइल का उपयोग भी करता हूं। मैं देखूंगा कि क्या मैं इसे Move() के साथ काम कर सकता हूं। धन्यवाद। – user1279914

+1

आप वर्णित प्रभाव देख रहे हैं [यहां] (http://stackoverflow.com/a/10472352/230513)। यदि आप अपना प्रश्न नए कोड के साथ अपडेट करते हैं तो मुझे यहां पिंग करें। – trashgod