Ermitteln der Größe einer EINGABE
Ermitteln der Größe einer EINGABE
Hallo ich bin noch ein Anfänger. Ich möchte zu Übungszwecken den Speicherbedarf einer Eingabe ermitteln.
Mein Anfang sieht so aus:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <stdio.h>
int main(int argc, char *argv[])
{
int len;
len = sizeof(argv[<!--no-->1<!--no-->]);
printf("Das Wort ist %d bytes groß\<!--no-->n", len);
}
</font><hr></pre></blockquote>
Leider bekomme ich IMMER eine Größe von vier bytes. Wie muß das Programm richtig aussehen, so das ich eingeben muß "./groesse blablabla"
und folgende Ausgabe bekomme "Das Wort ist 9 bytes groß"
danke schon mal im Voraus
Mein Anfang sieht so aus:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <stdio.h>
int main(int argc, char *argv[])
{
int len;
len = sizeof(argv[<!--no-->1<!--no-->]);
printf("Das Wort ist %d bytes groß\<!--no-->n", len);
}
</font><hr></pre></blockquote>
Leider bekomme ich IMMER eine Größe von vier bytes. Wie muß das Programm richtig aussehen, so das ich eingeben muß "./groesse blablabla"
und folgende Ausgabe bekomme "Das Wort ist 9 bytes groß"
danke schon mal im Voraus
Re: Ermitteln der Größe einer EINGABE
`*argv[]' ist ein Zeiger auf ein Array mit Zeigern, `argv<font size="1">' ist also der 2. Zeiger in diesem Array und zeigt auf den 1. Parameter ... ja und Zeiger sind bei ix86-Linux nun mal 32 Bit groß.
Nun brauchst Du den Zeiger nicht etwa dereferenzieren, denn die Parameter sind ja Strings und die C-Funktion zur _Längenbestimmung_ eines Strings will halt solch einen Zeiger.
Nun brauchst Du den Zeiger nicht etwa dereferenzieren, denn die Parameter sind ja Strings und die C-Funktion zur _Längenbestimmung_ eines Strings will halt solch einen Zeiger.
Re: Ermitteln der Größe einer EINGABE
#include <stdio.h>
int main (int argc, char *argv[]){
int len=0;
while (*arv[len]!='\0')len++;
printf("Das Wort ist %d zeichen groß
", len);
printf("die größe eines zeichens ict implementierungsabhängig, jedoch iA 1 Byte");
return 0;
}
int main (int argc, char *argv[]){
int len=0;
while (*arv[len]!='\0')len++;
printf("Das Wort ist %d zeichen groß
", len);
printf("die größe eines zeichens ict implementierungsabhängig, jedoch iA 1 Byte");
return 0;
}
-
- Posts: 57
- Joined: 11. Feb 2002 22:08
- Location: Laufen
- Contact:
Re: Ermitteln der Größe einer EINGABE
man strlen sollte helfen.
Re: Ermitteln der Größe einer EINGABE, GegenMichDarstellung
Klaut hier jemand Klammern? Mal probieren `argvEKauf 1 EKzu': `argv<font size="1">'<font size="2">
Tatsächlich, die Vorschau zeigt's, da steht nur noch `argv' ohne eckige Klammern mit 'ner 1 drin. Sind wohl irgendwelche Formatierungstags aktiviert ...
Ein click auf das Fragezeichen verrät mir mehr ... leider nur nicht wie man diesen Firlefanz ohne gleich [<!--no-->code<!--no-->] zu benutzen umgehen kann. Aha, also mit \<!--no-->.
So wird es also richtig:<blockquote><hr>
`*argv[<!--no--><!--no-->]' ist ein Zeiger auf ein Array mit Zeigern, `argv[<!--no-->1<!--no-->]' ist also der 2. Zeiger ...
<hr></blockquote>
Werde wohl heute schlecht schlafen können, wenn ich daran denke, einen C-Lernwilligen noch etwas falsches <b>gezeigert</b> zu haben. Also<pre>
*arg oder arg[<!--no-->0<!--no-->]
**arg oder *arg[<!--no-->0<!--no-->]
</pre> ist jeweils etwa das selbe. Wenn <font face="Courier New">arg</font><!--fixed--> ein Zeiger auf ein Array ist, bekommen wir sein erstes Element mit <font face="Courier New">*arg</font><!--fixed--> genau so wie mit <font face="Courier New">arg[<!--no-->0<!--no-->]</font><!--fixed-->.
Genug, chaos zeigt, wie schön man C lernen kann und Dominik ist eine Petze.
Tatsächlich, die Vorschau zeigt's, da steht nur noch `argv' ohne eckige Klammern mit 'ner 1 drin. Sind wohl irgendwelche Formatierungstags aktiviert ...
Ein click auf das Fragezeichen verrät mir mehr ... leider nur nicht wie man diesen Firlefanz ohne gleich [<!--no-->code<!--no-->] zu benutzen umgehen kann. Aha, also mit \<!--no-->.
So wird es also richtig:<blockquote><hr>
`*argv[<!--no--><!--no-->]' ist ein Zeiger auf ein Array mit Zeigern, `argv[<!--no-->1<!--no-->]' ist also der 2. Zeiger ...
<hr></blockquote>
Werde wohl heute schlecht schlafen können, wenn ich daran denke, einen C-Lernwilligen noch etwas falsches <b>gezeigert</b> zu haben. Also<pre>
*arg oder arg[<!--no-->0<!--no-->]
**arg oder *arg[<!--no-->0<!--no-->]
</pre> ist jeweils etwa das selbe. Wenn <font face="Courier New">arg</font><!--fixed--> ein Zeiger auf ein Array ist, bekommen wir sein erstes Element mit <font face="Courier New">*arg</font><!--fixed--> genau so wie mit <font face="Courier New">arg[<!--no-->0<!--no-->]</font><!--fixed-->.
Genug, chaos zeigt, wie schön man C lernen kann und Dominik ist eine Petze.
Re: Ermitteln der Größe einer EINGABE
chaos,
dein Beispiel bringt bei mir IMMER einen Speicherzugriffsfehler
dein Beispiel bringt bei mir IMMER einen Speicherzugriffsfehler
Re: Ermitteln der Größe einer EINGABE
> dein Beispiel bringt bei mir IMMER einen Speicherzugriffsfehler
Ist auch ziemlich chaotischer Code *lol*
Versuch's mal damit:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int len;
len = strlen(argv<font size="1">);
printf("Das Wort ist %d bytes groß
", len);
}
</font><hr></pre></blockquote>
Ist auch ziemlich chaotischer Code *lol*
Versuch's mal damit:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int len;
len = strlen(argv<font size="1">);
printf("Das Wort ist %d bytes groß
", len);
}
</font><hr></pre></blockquote>
Re: Ermitteln der Größe einer EINGABE
Oh Mann, diese besch** Board-Software!
Mein Beispiel war im wesentlichen dasselbe wie Deine Vorlage, nur hab ich statt sizeof(bla) strlen(bla) verwendet, und dazu noch string.h eingebunden. Das ist alles. die Grösse von argv(1) (ich vermeide mal die eckigen Klammern) ist in der Tat 4, weil - wie bereits erwähnt - argv(1) ein Zeiger ist, und der eben genau 32 Bits bzw. 4 Bytes braucht.
Im übrigen wird das Programm, so wie ich es geändert habe, segfaulten, wenn der Benutzer keinen Parameter eingibt. Aber wie man das checkt, findest Du sicher auch selbst raus.
Mein Beispiel war im wesentlichen dasselbe wie Deine Vorlage, nur hab ich statt sizeof(bla) strlen(bla) verwendet, und dazu noch string.h eingebunden. Das ist alles. die Grösse von argv(1) (ich vermeide mal die eckigen Klammern) ist in der Tat 4, weil - wie bereits erwähnt - argv(1) ein Zeiger ist, und der eben genau 32 Bits bzw. 4 Bytes braucht.
Im übrigen wird das Programm, so wie ich es geändert habe, segfaulten, wenn der Benutzer keinen Parameter eingibt. Aber wie man das checkt, findest Du sicher auch selbst raus.
Re: Ermitteln der Größe einer EINGABE
Bei chaos nur eine eckige Klammer wieder(?) einbauen und das Sternchen dafür weg!
<font face="Courier New">while( argv[<!--no-->1<!--no-->][<!--no-->len<!--no-->]!='\0')len++; // 1 für ersten Parameter u.s.w, 0 für Progname selbst<font face="Courier New">
Ski Heil!
<font face="Courier New">while( argv[<!--no-->1<!--no-->][<!--no-->len<!--no-->]!='\0')len++; // 1 für ersten Parameter u.s.w, 0 für Progname selbst<font face="Courier New">
Ski Heil!
Re: Ermitteln der Größe einer EINGABE
So gehts...
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int len,i;
for(i=1;i<argc;i++)
{
len = strlen(argv<i>);
printf("Das Wort ist %d bytes groß", len);
}
}
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int len,i;
for(i=1;i<argc;i++)
{
len = strlen(argv<i>);
printf("Das Wort ist %d bytes groß", len);
}
}
Re: Ermitteln der Größe einer EINGABE
nun aber....
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int len,j;
for(j=1;j<argc;j++)
{
len = strlen(argv[j]);
printf("Das Wort ist %d bytes groß", len);
}
}
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int len,j;
for(j=1;j<argc;j++)
{
len = strlen(argv[j]);
printf("Das Wort ist %d bytes groß", len);
}
}