Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #147710

Re: What are the odds? (a continuation of One works ...)

From David Brown <david.brown@hesbynett.no>
Newsgroups comp.lang.c
Subject Re: What are the odds? (a continuation of One works ...)
Date 2019-11-07 14:27 +0100
Organization A noiseless patient Spider
Message-ID <qq1649$vvi$1@dont-email.me> (permalink)
References (4 earlier) <voGwF.93833$vD7.57507@fx06.iad> <g4g6se5u1ggsmecioggck2k7ve59pfdbbp@4ax.com> <2VHwF.97943$_i.39059@fx25.am4> <ln36f05q6t.fsf@kst-u.example.com> <h2hhf7Fq967U11@mid.individual.net>

Show all headers | View raw


On 07/11/2019 04:30, Ian Collins wrote:
> On 07/11/2019 16:19, Keith Thompson wrote:
>> Bart <bc@freeuk.com> writes:
>>> On 06/11/2019 22:23, Barry Schwarz wrote:
>>>> On Wed, 6 Nov 2019 15:52:28 -0500, DFS <nospam@dfs.com> wrote:
>>>>>      char charset[62] =
>>>>> "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
>>>> After numerous examples in your comp.lang.c posts (where I have
>>>> redirected this response since we are not discussing the odds any
>>>> more) of calculating charsetLen correctly, you have chosen to use a
>>>> different method.  You have tried to pass charset to strlen in
>>>> complete violation of the requirements that function imposes.
>>>>
>>>> It is not sufficient to simply pass a pointer to char to strlen.
>>>> strlen requires that the pointer actually point to a string.  In order
>>>> for an array of char to contain a string, the array must contain at
>>>> least one '\0' to properly terminate the string.  charset does not.
>>>
>>> A simple fix is to get rid of the '62':
>>>
>>>    char charset[] =
>>>     "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
>>
>> The only thing the code does that depends on charset containing a
>> valid string is the single (incorrect) call to strlen().  If you
>> replace `strlen(charset)` by `sizeof charset` then there's no need
>> to nul-terminate it.
> Or do what I did in my C++ version and use a compile time constant for
> the size.  That way the compile will break if you miss out a character.
> 

C++ will complain if the initialiser is too long (as it is in this case,
but not if it is too short.  (A compiler may provide a warning, of course.)

I think the best way to ensure such arrays are the size you expect are
to omit the size in the definition, then use a static assertion to check it:

const char charset[] =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

_Static_assert(sizeof(charset) == 63,
	"Charset should be 62 chars plus terminating zero");

If you have got your alphabet wrong, you'll get a compile-time error.

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Re: What are the odds? (a continuation of One works ...) Barry Schwarz <schwarzb@delq.com> - 2019-11-06 14:23 -0800
  Re: What are the odds? (a continuation of One works ...) Bart <bc@freeuk.com> - 2019-11-06 22:35 +0000
    Re: What are the odds? (a continuation of One works ...) luser droog <luser.droog@gmail.com> - 2019-11-06 17:09 -0800
    Re: What are the odds? (a continuation of One works ...) Keith Thompson <kst-u@mib.org> - 2019-11-06 19:19 -0800
      Re: What are the odds? (a continuation of One works ...) Ian Collins <ian-news@hotmail.com> - 2019-11-07 16:30 +1300
        Re: What are the odds? (a continuation of One works ...) Bart <bc@freeuk.com> - 2019-11-07 10:59 +0000
        Re: What are the odds? (a continuation of One works ...) David Brown <david.brown@hesbynett.no> - 2019-11-07 14:27 +0100
  Re: What are the odds? (a continuation of One works ...) DFS <nospam@dfs.com> - 2019-11-06 18:09 -0500
    Re: What are the odds? (a continuation of One works ...) Keith Thompson <kst-u@mib.org> - 2019-11-06 19:26 -0800
      Re: What are the odds? (a continuation of One works ...) Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-07 11:57 +0000

csiph-web