[C] array doet raar of ik begrijp het niet

Pagina: 1
Acties:

  • Marc
  • Registratie: November 2001
  • Laatst online: 01-12-2021
hallo,
ik zit even helemaal in de war met arrays, dit is mijn code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>

int main() {
   char str[][10] = { "Test1", "Test2",
                     "Test3", "Test4",
                     "Test5", "Test6" };
   int i;

   for (i = 0; str[i]; i++) {
      printf("%d->%s\n", i, str[i]);
   }
   return 0;
}


ik dacht dat dit alle strings in str zou printen en dan stoppen na de laatste. dit is dus niet het geval, ik krijg al mijn enviroment variablen te zien (pas op i=40) en dit gaat door tot i=170 waarna hij segvt (cool werkwoord).
ik heb ook al
for (i = 0; str[i][0] != '\0'; i++) {
en
for (i = 0; str[i] != NULL; i++) {
gedaan maar het werkt beide niet.

iemand? (vast wel ;))

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>

int main() {
   char str[][10] = { "Test1", "Test2",
                     "Test3", "Test4",
                     "Test5", "Test6", NULL };
   int i;

   for (i = 0; *str[i]; i++) {
      printf("%d->%s\n", i, str[i]);
   }
   return 0;
}


Check regel 7 en 10 ;)

[ Voor 207% gewijzigd door kenneth op 03-02-2004 17:33 ]

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Hermen86
  • Registratie: November 2003
  • Laatst online: 30-04-2025
Het lijkt mij simpeler/veiliger om het aantal array-elementen vooraf te specificeren? Met een #define... :)

  • Marc
  • Registratie: November 2001
  • Laatst online: 01-12-2021
Hermen: heb ik ook gedaan, ik heb het alleen even versimpeld.
kenneth: werkt! dus je checkt je met *str[i] of str[i][0] 1 of 0 returned.

bedankt!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
kenneth schreef op 03 februari 2004 @ 17:28:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>

int main() {
   char str[][10] = { "Test1", "Test2",
                     "Test3", "Test4",
                     "Test5", "Test6", NULL };
   int i;

   for (i = 0; *str[i]; i++) {
      printf("%d->%s\n", i, str[i]);
   }
   return 0;
}


Check regel 7 en 10 ;)
Dus, zodra char[6] overschreven wordt met een char* dan loopt het in de soep. En dat mag, aangezien je geen array's van const char* hebt gemaakt.
Je initialiseerd je arraysize met een constante (dmv een initializer), dus waarom deze niet gewoon expliciet definieëren en gebruiken waar hij voor is

[ Voor 9% gewijzigd door Glimi op 03-02-2004 17:57 ]


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

@Glimi: Ja klopt, er valt wel meer op aan te merken :)
Maargoed, het ging om *str[] ipv str[], en je laatste element op NULL initialiseren.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09:47

.oisyn

Moderator Devschuur®

Demotivational Speaker

Glimi schreef op 03 februari 2004 @ 17:54:
[...]

Dus, zodra char[6] overschreven wordt met een char* dan loopt het in de soep.
str is een char[7][10], geen char *[10]. Er zijn dus 7 strings van elk 10 tekens lang. En aangezien je per string een vaste grootte hebt van 10 tekens is dat geen probleem
Je initialiseerd je arraysize met een constante (dmv een initializer), dus waarom deze niet gewoon expliciet definieëren en gebruiken waar hij voor is
:?

Overigens is de code van kenneth fout minder netjes, aangezien het vaste char buffers zijn (en dus geen pointers), waardoor je de inhoud van (char *)0 kopieert naar de buffer (wat dus keihard crashed blijkbaar kun je een null ptr wel assignen aan een element in een char[] array, waardoor het hetzelfde is als een lege string. Toch vind ik het een ontzettend ranzige constructie).

Je kunt het aantal elementen trouwens bepalen met sizeof (str) / sizeof (str[0])

[ Voor 40% gewijzigd door .oisyn op 03-02-2004 18:20 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
.oisyn schreef op 03 februari 2004 @ 18:09:
Ten eerste is het geen char[6] maar een char[7][10]. En aangezien je dus per string dus een vaste grootte hebt van 10 tekens is dat geen probleem
Uh? Het is best een char[7][10], daarom juist zal het schrijven op positie 6 een crash generen.
Overigens, zit ik wel te ijlen omdat het hier wel om const char[] gaat :X

Ajah, je viel over m'n foutieve * en [] gebruik :)
:?
Als je een initializer hebt, weet je van te voren hoeveel elementen in die array gaan komen. Je kunt dus ook de array expliciet met deze constante construëren en dan vullen met de waardes.
Vervolgens is de array aflopen geen probleem meer met een forloop

[ Voor 5% gewijzigd door Glimi op 03-02-2004 18:25 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09:47

.oisyn

Moderator Devschuur®

Demotivational Speaker

Glimi schreef op 03 februari 2004 @ 18:24:
Uh? Het is best een char[7][10], daarom juist zal het schrijven op positie 6 een crash generen.
Overigens, zit ik wel te ijlen omdat het hier wel om const char[] gaat :X

Ajah, je viel over m'n foutieve * en [] gebruik :)
Nou het is dus geen array van pointers, maar gewoon een 2D array. Elk element in de array, bijvoorbeeld str[3], is van het type char[10] en dus niet char *. Je kunt er dus maximaal 10 chars in kwijt. Bovendien is het gewoon geheugen op de stack, wat je aan kunt passen. Andere strings ernaartoe kopiëren is derhalve geen probleem
Als je een initializer hebt, weet je van te voren hoeveel elementen in die array gaan komen. Je kunt dus ook de array expliciet met deze constante construëren en dan vullen met de waardes.
Ja maar wat is het nut ervan? Dat vereist dat je zelf de hele tijd moet tellen hoeveel elementen je er nu hebt staan, en je moet die constante bovendien de hele tijd wijzigen als je er een element aan toevoegd of verwijderd. De [] notatie is dan een stuk handiger :)

En de grootte bepalen kan gewoon @ compile-time met de constructie die ik al gaf
(en in C++ kun je dat met een mooie template functie doen:

C++:
1
2
3
4
5
6
7
8
9
10
template <class T, int N> int array_length (T (&)[N])
{
    return N;
}

int main ()
{
    char *str[] = { "aap", "noot", "mies" };
    std::cout << array_length (str) << std::endl;   // prints 3
}


Maar het ging hier over C dus dat is nogal offtopic ;))

[ Voor 23% gewijzigd door .oisyn op 03-02-2004 19:14 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1