Mentor for C self study wanted

Bruce Cran bruce at cran.org.uk
Tue Oct 23 15:33:29 PDT 2007


Derek Ragona wrote:
> At 04:24 PM 10/23/2007, Harald Schmalzbauer wrote:
>> Am Dienstag, 23. Oktober 2007 22:24:54 schrieb Bill Moran:
>> > In response to cpghost <cpghost at cordula.ws>:
>> > > On Tue, 23 Oct 2007 20:44:52 +0200
>> > >
>> > > Harald Schmalzbauer <h.schmalzbauer at omnisec.de> wrote:
>> > > > The first one was for example the attached code: Why does it 
>> segfault?
>> > >
>> > > Mailman ate the attachment... Can't see it here.
>> >
>> > I may be out of line, but I think if you're using FreeBSD as your
>> > learning platform, that it wouldn't be a problem to ask this list.
>> >> Harald Schmalzbauer wrote:
>> > > Am Dienstag, 23. Oktober 2007 21:43:52 schrieben Sie:
>> > >>> Hello Aryeh,
>> > >>>
>> > >>> I'm willing to pay fair fees, but are you interested in "micro 
>> payment"
>> > >>> ;) ?
>> > >>
>> > >> For other reasons I love micro payments.
>> > >>
>> > >>> Serious, I'll have the one or other short question per week (I'm
>> > >>> usually busy, just making spare time lessons from my book (UTC-1 
>> spare
>> > >>> time)).
>> > >>
>> > >> Just so I know what level to present on what is your background 
>> in CS
>> > >> and programming?
>> > >
>> > > CS??
>> > > I'm able to solve problems analytically, but I don't know any 
>> language
>> > > really well.
>> > > I know bourne shell, csh, pascal, and basic. And a tiny bit asm, but
>> > > that's been on ZX81.
>> >
>> > Although, you'll have to include your code inline to get past the
>> > sanitizers.
>>
>> Thanks all,
>>
>> here was my example, just for completeness, I found mentors for my needs.
>>
>> Thanks a lot to all!
>>
>>
>> #include <stdio.h>
>>
>> void main()
>> {
>>   short nnote;
>>
>>   // Numerischen Notenwert einlesen
>>   printf("Bitte numerischen Schulnotenwert eingeben: ");
>>   scanf("%d",&nnote);
>>
>>   switch (nnote)
>>   {
>>     case 1: printf("Die Note %d entspricht sehr gut.",nnote);
>>     break;
>>     case 2: printf("Die Note %d entspricht gut.",nnote);
>>     break;
>>     case 3: printf("Die Note %d entspricht befriedigend.",nnote);
>>     break;
>>     case 4: printf("Die Note %d entspricht ausreichend.",nnote);
>>     break;
>>     case 5: printf("Die Note %d entspricht mangelhaft.",nnote);
>>     break;
>>     case 6: printf("Die Note %d entspricht ungenügend.",nnote);
>>     break;
>>     default: printf("%d ist keine zulässige Schulnote!");
>>   }
>>   printf("\n");
>> }
>>
>> P.S.:
>> I found that declaring nnote as int soleves my problem, but I couldnÄt
>> understand why.
>> Another one was the result of default: nnote was -1077942208 instead 
>> of 9 for
>> example.
> 
> if you check the man page on scanf:
>  d     Matches an optionally signed decimal integer; the next pointer must
>            be a pointer to int.
> 
> You shouldn't try to put a short into an int.  Always declare the 
> correct size for variables.  Your segv is because scanf was trying to 
> put an int where it won't fit.
> 
> You will get the same result if you go off the end of an array.
> 
>         -Derek
> 

It's well worth increasing the number of warnings enabled when writing C 
code, to catch any errors early on.  -Wall catches this sort of mistake.

Compiling your code gives the following output:

 > gcc -Wall test.c -o test
test.c:4: warning: return type of 'main' is not 'int'
test.c: In function 'main':
test.c:9: warning: format '%d' expects type 'int *', but argument 2 has 
type 'short int *'

--
Bruce Cran


More information about the freebsd-questions mailing list