digitalmars.D.learn - Can we use strings with scanf?
- Rempas (3/3) Jan 25 2021 For printf() we can use this format `"%.*s", cast(int)s s.length,
- Mike Parker (12/15) Jan 25 2021 The * has a different meaning for scanf than for printf ([1] vs
- Rempas (6/21) Jan 25 2021 Thanks! Actually for some reason. It won't accept a char[size]. I
- Ferhat =?UTF-8?B?S3VydHVsbXXFnw==?= (4/29) Jan 25 2021 char[buffsize] works if buffsize is a compile time constant. Or
- Rempas (3/15) Jan 25 2021 Idk, for my it says that you can't pass dynamic arrays to scanf
- H. S. Teoh (9/25) Jan 25 2021 Dynamic arrays in D are "fat" pointers, they have a .ptr and .length,
For printf() we can use this format `"%.*s", cast(int)s s.length, s.ptr`. When trying to use the same for scanf(), it says that this specifier is invalid.
Jan 25 2021
On Monday, 25 January 2021 at 09:16:11 UTC, Rempas wrote:For printf() we can use this format `"%.*s", cast(int)s s.length, s.ptr`. When trying to use the same for scanf(), it says that this specifier is invalid.The * has a different meaning for scanf than for printf ([1] vs [2]). There's also the issue that a string is immutable(char)[]. If you really, really, really, must use scanf: ``` char[bufSize] buf; scanf("%s", buf.ptr); ``` But please don't. This is D, not 1990s C. [1] https://www.cplusplus.com/reference/cstdio/scanf/ [2] https://www.cplusplus.com/reference/cstdio/printf/
Jan 25 2021
On Monday, 25 January 2021 at 10:33:14 UTC, Mike Parker wrote:On Monday, 25 January 2021 at 09:16:11 UTC, Rempas wrote:Thanks! Actually for some reason. It won't accept a char[size]. I created a heap allocated (with pureFree and pureMalloc) chrar*, then used fgets() and created an empty string and looped through the result adding one by one character until the '\n' which is not included.For printf() we can use this format `"%.*s", cast(int)s s.length, s.ptr`. When trying to use the same for scanf(), it says that this specifier is invalid.The * has a different meaning for scanf than for printf ([1] vs [2]). There's also the issue that a string is immutable(char)[]. If you really, really, really, must use scanf: ``` char[bufSize] buf; scanf("%s", buf.ptr); ``` But please don't. This is D, not 1990s C. [1] https://www.cplusplus.com/reference/cstdio/scanf/ [2] https://www.cplusplus.com/reference/cstdio/printf/
Jan 25 2021
On Monday, 25 January 2021 at 17:38:21 UTC, Rempas wrote:On Monday, 25 January 2021 at 10:33:14 UTC, Mike Parker wrote:char[buffsize] works if buffsize is a compile time constant. Or just char[1024]. İt is a static array, and it's size must be defined at compile time.On Monday, 25 January 2021 at 09:16:11 UTC, Rempas wrote:Thanks! Actually for some reason. It won't accept a char[size]. I created a heap allocated (with pureFree and pureMalloc) chrar*, then used fgets() and created an empty string and looped through the result adding one by one character until the '\n' which is not included.[...]The * has a different meaning for scanf than for printf ([1] vs [2]). There's also the issue that a string is immutable(char)[]. If you really, really, really, must use scanf: ``` char[bufSize] buf; scanf("%s", buf.ptr); ``` But please don't. This is D, not 1990s C. [1] https://www.cplusplus.com/reference/cstdio/scanf/ [2] https://www.cplusplus.com/reference/cstdio/printf/
Jan 25 2021
On Monday, 25 January 2021 at 18:28:09 UTC, Ferhat Kurtulmuş wrote:On Monday, 25 January 2021 at 17:38:21 UTC, Rempas wrote:Idk, for my it says that you can't pass dynamic arrays to scanfOn Monday, 25 January 2021 at 10:33:14 UTC, Mike Parker wrote:char[buffsize] works if buffsize is a compile time constant. Or just char[1024]. İt is a static array, and it's size must be defined at compile time.[...]Thanks! Actually for some reason. It won't accept a char[size]. I created a heap allocated (with pureFree and pureMalloc) chrar*, then used fgets() and created an empty string and looped through the result adding one by one character until the '\n' which is not included.
Jan 25 2021
On Mon, Jan 25, 2021 at 06:43:18PM +0000, Rempas via Digitalmars-d-learn wrote:On Monday, 25 January 2021 at 18:28:09 UTC, Ferhat Kurtulmuş wrote:Dynamic arrays in D are "fat" pointers, they have a .ptr and .length, but scanf expects C-style bare pointers, so you have to specify .ptr in order to pass the pointer to scanf. Be aware, however, that doing this means you no longer have D's bounds-checking protection, and scanf may cause buffer overruns if the user gives bad input. T -- Being able to learn is a great learning; being able to unlearn is a greater learning.On Monday, 25 January 2021 at 17:38:21 UTC, Rempas wrote:Idk, for my it says that you can't pass dynamic arrays to scanfOn Monday, 25 January 2021 at 10:33:14 UTC, Mike Parker wrote:char[buffsize] works if buffsize is a compile time constant. Or just char[1024]. İt is a static array, and it's size must be defined at compile time.[...]Thanks! Actually for some reason. It won't accept a char[size]. I created a heap allocated (with pureFree and pureMalloc) chrar*, then used fgets() and created an empty string and looped through the result adding one by one character until the '\n' which is not included.
Jan 25 2021