PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ist es möglich "blablablubb:lalalennenenen" mit fscanf gescheit auszulesen?



Schnitz
15-04-2003, 15:11
also ich will eine htacces passwortdatei auslesen und das gnaze in eine struc mit array schreiben, nun hab ich aber möglicherweiße in die falsche richtung programmiert :(



file = fopen("passwd", "r+");

while((fscanf(file,"%s:%s", data[i].username, data[i].passwd))!=EOF)
{
i++;
}

fclose(file);


nun muss man das ding irgendwie dazu bringen das es den : nicht in den string mit reinnimmt sondern da den string wirklich spalten tut, das muss doch irgendwie gehen, und wenn's noch so ne komplizierte verkettung von sonderzeichen ist... :(

DanDanger
15-04-2003, 17:54
Hmm,

ich hab' das ganze jetzt mal ohne scanf() gemacht :
Compiliere einfach mal mein Beispiel :

Beispiel :


#include <iostream.h>

char *c = "123:456" ;
char Name[10] ;
char Pasw[10] ;

int OK = 0 ;

void main()
{
int j = 0 ;
int f = 0 ;

while (c[j] != '\0')
{

if(!OK) {
if (c[j] == ':') {
OK = 1 ;
j++ ;
continue ;
}
Name[j] = c[j] ;

}
else
{
Pasw[f] = c[j] ;
}
j++ ;
if(OK) { f++ ; }
}


cout << "Name : " << Name << endl ;
cout << "Passw : " << Pasw << endl ;

}


Die Bildschirmausgabe sieht so aus :


Name : 123
Passw: 456


Der Doppelpunkt (":") wird durch das "j++" in der "ifc[j] == ':' " - Abfrage herausgesmissen.
Ich hab das jetzt in C++ gemacht, das ganze funzt aber auch Prima in C, musst halt nur "cout" durch "printf()" ersetzen und die "iostream.h" 'rausschmeissen und durch "stdlib.h" und "stdio.h" ersetzen.

Grüsse
DanDanger

Schnitz
15-04-2003, 18:35
vielen dank für deine antwort, ich werds morgen gleich ausprobieren :)

anda_skoa
15-04-2003, 19:41
So ginge es in C mit sscanf



include <stdio.h>

int main()
{
char name[100];
char passwd[100];

char* test = "abcd:xyz";

sscanf(test, "%[^:]%*[:]%s", name, passwd);

printf("name: %s\npasswd: %s\n", name, passwd);

return 0;
}

man kann natürlich sscanf durhc fscanf ersetzen.

Das Problem ist, dass hier ein Bufferoverflow auftreten kann, weil name und passwd nicht unbedingt lange genug sein müssen.

Das müssten man normalerweise vorher checken.

Ciao,
_

anda_skoa
15-04-2003, 19:48
In C++ kann man das so machen



#include <string>
#include <iostream>

using namespace std;

int main()
{
string s = "abc:xyz";
string name;
string passwd;

size_t pos = s.find(':');

if (pos != string::npos)
{
name = s.substr(0, pos);
passwd = s.substr(pos+1, s.size());
}

cout << "Name: " << name << endl;
cout << "Passwd: " << passwd << endl;

return 0;
}


Das string ja dynamische Länge erlaubt, gibt es hier keine Bufferoverflow Probleme.

Ciao,
_

Schnitz
16-04-2003, 08:08
Original geschrieben von anda_skoa
So ginge es in C mit sscanf



include <stdio.h>

int main()
{
char name[100];
char passwd[100];

char* test = "abcd:xyz";

sscanf(test, "%[^:]%*[:]%s", name, passwd);

printf("name: %s\npasswd: %s\n", name, passwd);

return 0;
}

man kann natürlich sscanf durhc fscanf ersetzen.

Das Problem ist, dass hier ein Bufferoverflow auftreten kann, weil name und passwd nicht unbedingt lange genug sein müssen.

Das müssten man normalerweise vorher checken.

Ciao,
_

THX! Genau das mit den [ und ] hab ich gesucht, hatte aber keine Ahnung wie man das schreibt. Die Strings sind auf jeden Fall lang genug da es eine htpasswd Datei ist.

:D