Error reading char in read

wiki via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Feb 17 12:05:36 PST 2017


On Friday, 17 February 2017 at 18:57:55 UTC, Ali Çehreli wrote:
> On 02/17/2017 07:48 AM, Jean Cesar wrote:
>> import std.stdio;
>> import std.string;
>>
>>
>> auto read(C)(ref C c, char[80] message)
>> if (isSomeChar!C) {
>>     writef("\n\t%s: ", message);
>>     c = strip(readf());
>>     readf(" %s", &t);
>>     return c;
>> }
>>
>> void main()
>> {
>>  char[50] message;
>>   read(message,"Digite Seu nome: ");
>>  writeln(message);
>> }
>>
>> estou tentando fazer um leitor de vetor de char porem esta 
>> dando erro
>
> My recommendation is to read some tutorials as there are many 
> large and small differences between D, C++, and Java.
>
> Some notes:
>
> - In D, char is UTF-8 code unit. Perhaps you want to read ubyte 
> (or byte)?
>
> - isSomeChar is defined in std.traits. You must import 
> std.traits if you want to use isSomeChar:
>
>   https://dlang.org/phobos/std_traits.html
>
> - From the way you call read(), it looks like you want to read 
> a char array (vector), not a single char. So, isSomeChar is 
> wrong.
>
> - It is common to use the string type in D. string is an array 
> of immutable chars. We can change my read() function to read 
> char[] as well:
>
> - Static arrays like char[50] are different from slices like 
> char[].
>
> The read() examples I had given are incomplete: They should 
> work with value types and dynamic strings but not with static 
> arrays. Here is another read() that works with char arrays:
>
> import std.stdio;
> import std.string;
> import std.traits;
> import std.range;
> import std.algorithm;
>
> auto read(S)(ref S s, string message)
> if (isSomeString!S) {
>     import std.string : strip;
>     writef("%s: ", message);
>     s = readln().strip();
>     return s;
> }
>
> auto read(S)(ref S s, string message)
> if (isStaticArray!S &&
>     isSomeChar!(ElementType!S)) {
>
>     string tmp;
>     read(tmp, message);
>
>     // Clear the array
>     s[] = typeof(s[0]).init;
>
>     // Assign without going out of bounds
>     const len = min(s.length, tmp.length);
>     s[0..len] = tmp[0..len];
>
>     return s;
> }
>
> void main()
> {
>     char[50] message;
>     read(message,"Digite Seu nome: ");
>     writeln(message);
> }
>
> However, you'll see that static arrays may not be suitable for 
> reading text, as char[50] will never know how long the actual 
> text is. Here is the output:
>
> Digite Seu nome: : Jean
> Jean\377\377\377[...]
>
> For that to work, you would have to rely on the old C 
> representation of strings with the '\0' character:
>
>     // Assign without going out of bounds
>     const len = min(s.length, tmp.length);
>     s[0..len] = tmp[0..len];
>     const nullChar = min(s.length - 1, len);
>     s[nullChar] = '\0';
>
> However, it still doesn't work because char[50] still has 50 
> characters:
>
> Jean^@\377\377[...]
>
> As you see, you better use 'string' (or its mutable version, 
> char[]) for such text.
>
> And again, it will take a long time to go through these basics 
> unless you start with some tutorials:
>
>   https://tour.dlang.org/
>
> For strings:
>
>   https://tour.dlang.org/tour/en/basics/alias-strings
>
> Some books:
>
>   https://wiki.dlang.org/Books
>
> Ali

So I executed it here anyway but still it presents arbitrary 
characters in the char ..

What I thought was to create a reader where I could receive,
Char, string, int, float, double, real, for my future codes ....

I tried doing this to understand how the char reading was, it is 
preferable to use strings but the language has some specific 
reader for char?

minha frase na captura de char ������������������������


More information about the Digitalmars-d-learn mailing list