PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C Aufgabe - Benötige Hilfe



Daywa1k3r
11.05.2015, 13:41
Hi,

ich möchte meine Quellcode vor DAU's absichern, unzwar dürfen die Argumente beim Start des Programmes (Kommandozeilenparameter)
keine Strings bzw. Chars enthalten, also nur numerische Werte dürfen mitgegeben werden.

Am Ende des folgenden Quellcodes ist ein Versuch von mir, welcher leider nicht das gewünscht Ergebnis liefert.
Hat jemand einen Tipp oder Lösungsvorschlag? Ich stelle mir vor, dass ich die übergeben Parameter durchlaufen und auf Chars überprüfe, aber wie ? :(




#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>

#define ANZ_ZUF 6
#define MAX_WUERFEL 1000
#define MAX_AUGENZAHL 1000



void zufall_init();
int checkargus(char *argv[]);
int zufallszahl(int max);


int main(int argc, char *argv[]){

int i, err, err2,maxw, zaehler;
zufall_init();


/* for(i=0;i< 10;i++)
{
printf("aRG. %i: %s\n",i,argv[i]);
isNumber(argv[i]);
}*/



if(argc == 3)
{

err= checkargus(&argv[0]);
if(err==0)
{
maxw = atoi(argv[2]);
zaehler= atoi(argv[1]);
//err= checkargus(&argv[2]);
printf("Das Programm lautet: %s\n",argv[0]);

for(i=0; i<zaehler ;i++)
printf("Die %i. Zahl ist: %i\n", i+1, zufallszahl(maxw));
}else if(err==1)
printf("Fehlerhafte Parameter!\n");

}else
{
printf("Fehlerhafte Parameter!\n");
}

}


void zufall_init(){
time_t t;
time(&t);
srand((unsigned int) t);
}

int zufallszahl(int max){
return rand() % max;
}

int checkargus(char *argv[])
{
int argument1;
int argument2;

argument1 = atoi(argv[1]);
// argument2 = atoi((*(argv + 2)));
argument2 = atoi(argv[2]);

int i,x,y;

if((argument1 <= MAX_WUERFEL) && (argument1 > 0)){
if((argument2 < MAX_AUGENZAHL ) && (argument2 > 0))
return 0;

}
else
return 1;
}


/*{
for(i=0; i<=x ;i++)
{
if((x > 0) && (x <=9))
return 1;
if((y > 0) && (y <=9))
return 1;
else
return 0;
}
return 0;
}*/

Nookie
11.05.2015, 17:59
Aloha

Also als erstens brauchst du die Anzahl der Parameter im Array.
Mit C musst du das etwas umständlich machen:



//Grösse eines einzelnen Elementes in Byte durch die grösse des gesamten Array teilen um die Länge des Arrays zu berechnen:
int lenght = sizeof(a) / sizeof(a[0]);


Danach solltest du mit die einzelnen werte durch diese Funktion jagen können um zu prüfen ob sie numerisch sind:



bool isnumeric(string st) {
int len = st.length();
for (int i = 0; i < len; i++) {
if (int(st[i])<48 || int(st[i]) > 57) {
return false;
}
}
return true;
}


Ich hoffe du kriegst dein Programm damit zum laufen ;)

rax
11.05.2015, 18:10
Oder einfach den C String mit strtol umwandeln und endptr überprüfen ;-)

strtol(3):


...
If endptr is not NULL, strtol() stores the address of the first
invalid character in *endptr. If there were no digits at all,
strtol() stores the original value of nptr in *endptr (and returns
0). In particular, if *nptr is not '\0' but **endptr is '\0' on return, the entire string is valid.
...

R3s1stanc3
11.05.2015, 19:44
Aloha

Also als erstens brauchst du die Anzahl der Parameter im Array.
Mit C musst du das etwas umständlich machen:



//Grösse eines einzelnen Elementes in Byte durch die grösse des gesamten Array teilen um die Länge des Arrays zu berechnen:
int lenght = sizeof(a) / sizeof(a[0]);


Das funktioniert nur, wenn das Array im selben Codeblock initialisiert wurde. Wenn du das Array an eine Funktion übergibst, z.B. myFunc(char *array) funktioniert das ganze nicht mehr. Wenn das Array als Parameter übergeben wird ist sizeof(a) == sizeof(char*). In dem Fall müsstest du die Länge immer noch als 2. Paramter an die Funktion übergeben: void myFunc(char *array, size_t len)



Danach solltest du mit die einzelnen werte durch diese Funktion jagen können um zu prüfen ob sie numerisch sind:



bool isnumeric(string st) {
int len = st.length();
for (int i = 0; i < len; i++) {
if (int(st[i])<48 || int(st[i]) > 57) {
return false;
}
}
return true;
}


Ich hoffe du kriegst dein Programm damit zum laufen ;)
bool gehört nicht zum C Wortschatz, string auch nicht. Dafür benutzt man in C int und char*
st.length() gibt es auch nicht. strlen() ist die Funktion, die du suchst.
Typecast in C sieht ein klein wenig anders aus: "(int)st[i]<48" wobei man in dem Fall nicht casten muss, da man int und char direkt vergleichen kann
In C99 würde deine Funktion so aussehen:

int isnumeric(char *st) {
int len = strlen(st);
int i ;
for (i = 0; i < len; i++) {
if (st[i]<48 || st[i] > 57) {
return 0;
}
}
return 1;
}

rax
11.05.2015, 20:44
mit c99 wäre auch die variablen deklaration in der schleife konform.. was dem zweck mehr entsprechen würde als außerhalb ;)

blackberry
11.05.2015, 20:50
bool gehört nicht zum C Wortschatz

#include <stdbool.h>

P.S.: hatte den Code schon getippt, bevor ich die Antwort von rax gelesen hatte. Wäre schade, den jetzt einfach wegschmeißen zu müssen, also:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
int i, x;
char *p;
for(i = 1; i < argc; i++)
{
x = strtol(argv[i], &p, 10);
if (*p)
printf("(str arg) '%s'\n", argv[i]);
else
printf("(int arg) %d\n", x);
}
return 0;
}

Nookie
11.05.2015, 20:52
bool gehört nicht zum C Wortschatz, string auch nicht. Dafür benutzt man in C int und char*
st.length() gibt es auch nicht. strlen() ist die Funktion, die du suchst.
Typecast in C sieht ein klein wenig anders aus: "(int)st[i]<48" wobei man in dem Fall nicht casten muss, da man int und char direkt vergleichen kann


Ich sollte mach mal wider mit Hardwarenäheren sprachen befassen... :/

Daywa1k3r
11.05.2015, 21:14
Bin jetzt auch zum Ergebnis bekommen mit dem Hinweis von rax. Mein Quelltext sieht so ähnlich aus wie der von blackberry.

Danke euch!

IRET
12.05.2015, 12:42
Aloha

Also als erstens brauchst du die Anzahl der Parameter im Array.
Mit C musst du das etwas umständlich machen:



//Grösse eines einzelnen Elementes in Byte durch die grösse des gesamten Array teilen um die Länge des Arrays zu berechnen:
int lenght = sizeof(a) / sizeof(a[0]);


Danach solltest du mit die einzelnen werte durch diese Funktion jagen können um zu prüfen ob sie numerisch sind:



bool isnumeric(string st) {
int len = st.length();
for (int i = 0; i < len; i++) {
if (int(st[i])<48 || int(st[i]) > 57) {
return false;
}
}
return true;
}


Ich hoffe du kriegst dein Programm damit zum laufen ;)

Einfach argc für die Anzahl nehmen.