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

Reply via email to