Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
April 23, 2015 User input readline || readf | ||||
---|---|---|---|---|
| ||||
Hy, i'm new @ D and i come from python. Sorry for my engish, i understand good, but i write like a cow spanish. I make a little programm to add human's name and age and a function to write out alls humans in the list. Here is the source: http://dpaste.dzfl.pl/0a0da462225d The problem is, it writes instant "Name: Age:" at the standart output. I'm little confuse about readf and readline, what to use. or its the failure in write ? I hope anybody can help me, as long as anybody understand me and my problem. ;) Greetings from Swiss. Kerze |
April 23, 2015 Re: User input readline || readf | ||||
---|---|---|---|---|
| ||||
Posted in reply to kerze | hmm the paste is away ?!? here i post my source one more time. [code] import std.stdio; import std.string; struct Human { string name; ushort age; }; void print_human_list(Human[] human_list){ foreach(human; human_list){ writeln(human.name); writeln(human.age); } writeln(""); } void add_new_human(Human[] human_list){ ushort age; // write("Name: "); // The Output is string name = strip(stdin.readln()); // Name: Age: write("Age: "); // And the Error readf(" %u", &age); // std.conv.ConvException@/usr/include/dlang/ldc/std/conv.d(1968): Human tmp_human = {name, age}; // Unexpected 's' when converting from type LockingTextReader to type uint human_list ~= tmp_human; } int main(){ Human[] human_list; char choice; for(;;){ writeln("A)dd New Human."); writeln("P)rint Human List."); writeln("Q)uit."); write(": "); readf("%c", &choice); switch(choice){ case('A') : add_new_human(human_list); case('P') : print_human_list(human_list); case('Q') : return 0; default : continue; } } } [/code] |
April 23, 2015 Re: User input readline || readf | ||||
---|---|---|---|---|
| ||||
Posted in reply to kerze | On 4/23/15 1:17 PM, kerze wrote:
> The problem is, it writes instant "Name: Age:" at the standart output.
readf reads the element from the stream, and NOTHING MORE, it leaves the newline on the stream.
So the next readf then reads the newline as a string. You can fix this by using readf(" %s"), which means "read any whitespace, then my data".
-Steve
|
April 23, 2015 Re: User input readline || readf | ||||
---|---|---|---|---|
| ||||
Posted in reply to kerze | The paste is still there. readf leaves the \n from pressing enter in stdin, which gets read by the next function that's accessing it. I answered a similiar question in another thread: http://forum.dlang.org/post/jwxfaztgsyzwqpzajqmf@forum.dlang.org I see two other mistakes in your code as well: 1. I'm pretty sure you want to pass print_human_list and add_new_human a reference to the human_list array. Just add "ref" before "Human[] human_list". > void print_human_list(ref Human[] human_list) 2. In D there exists something called switch fallthrough. Just add a "break;" after each case and only the matching block will be executed. >case('A'): > add_new_human(human_list); > break; Willkommen in der D Community. ;) |
April 23, 2015 Re: User input readline || readf | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jacques Müller |
> Willkommen in der D Community. ;)
So many Thanks @Steven and Jacques, answer's more than a only; "do this" ;)
|
April 23, 2015 Re: User input readline || readf | ||||
---|---|---|---|---|
| ||||
Posted in reply to kerze | On Thursday, 23 April 2015 at 17:18:01 UTC, kerze wrote:
> Hy, i'm new @ D and i come from python.
> Sorry for my engish, i understand good, but i write like a cow spanish.
>
> I make a little programm to add human's name and age and a function to write out alls humans in the list.
>
> Here is the source:
>
> http://dpaste.dzfl.pl/0a0da462225d
>
> The problem is, it writes instant "Name: Age:" at the standart output.
>
> I'm little confuse about readf and readline, what to use. or its the failure in write ?
>
> I hope anybody can help me, as long as anybody understand me and my problem. ;)
>
> Greetings from Swiss.
>
> Kerze
I can offer, for example, such an option:
-----
import std.conv;
import std.stdio;
import std.string;
import std.typecons;
Tuple!(string, ushort)[] humanList;
void printHumanList() {
foreach (e; humanList) {
writeln(e[0]);
writeln(e[1]);
}
}
void addNewHuman(){
write("Age: ");
ushort age = readln.strip.to!ushort;
write("Name: ");
string name = readln.strip;
humanList ~= tuple(name, age);
}
void main(){
char choice;
for(;;) {
writeln("A)dd New Human.");
writeln("P)rint Human List.");
writeln("Q)uit.");
write(": ");
choice = readln.strip.to!char;
switch (choice){
case('A'):
addNewHuman;
break;
case('P'):
printHumanList;
break;
case('Q'):
return;
default:
continue;
}
}
}
|
April 23, 2015 Re: User input readline || readf | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dennis Ritchie | It also works: ----- import std.conv; import std.stdio; import std.string; struct Human { string name; ushort age; } void print_human_list(Human[] human_list) { foreach(human; human_list) { writeln(human.name); writeln(human.age); } writeln(); } void add_new_human(ref Human[] human_list) { write("Name: "); string name = readln.strip; write("Age: "); ushort age = readln.strip.to!ushort; Human tmp_human = {name, age}; human_list ~= tmp_human; } void main() { Human[] human_list; for(;;) { writeln("A)dd New Human."); writeln("P)rint Human List."); writeln("Q)uit."); write(": "); char choice = readln.strip.to!char; switch (choice) { case('A'): add_new_human(human_list); break; case('P'): print_human_list(human_list); break; case('Q'): return; default: continue; } } } ----- http://ideone.com/0cS7Y4 |
Copyright © 1999-2021 by the D Language Foundation