PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C strlen Ausgabe?


Gangstaslida
2005-04-13, 16:26:14
Wenn ich mit
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>


int main(void)
{
char ,eingabe[21];

printf("Maximal 20 Zeichen eingeben: ");
scanf("%s",eingabe);
int a;
a=strlen(eingabe);
printf("\n %s hat %d zeichen",eingabe, a);
}

Die Länge eines Strings abfrage, kommt er nur bis zum ersten Leerzeichen. Wenn ich z.B. "Gangsta Slida" eingebe, gibt er nur a=7 aus.
Ich könnte natürlich den String mit einer For-Schleife durchgehen, bis er zum Nullterminierten Ende kommt, gehts irgendwie einfacher? :frown:
edit: Gibt es eigentlich einen Bufferowerflow, wenn ich mehr als 21 Zeichen eingebe :|
Hmm, sollte wohl noch ne Abfrage einbauen ;D

zeckensack
2005-04-13, 16:42:53
Dein Problem ist nicht strlen, sondern scanf (http://www.cplusplus.com/ref/cstdio/scanf.html). Es schneidet beim Leerzeichen ab.

Und noch was:char ,eingabe[21];Das Komma sollte weg.

Gangstaslida
2005-04-13, 16:57:30
Super, danke für die schnelle Antwort
String of characters. This will read subsequent characters until a whitespace is found (whitespace characters are blank, newline and tab).

Hmm, aber keine Lösung? Wie kann ich das umgehen :confused:

Exxtreme
2005-04-13, 17:02:29
edit: Gibt es eigentlich einen Bufferowerflow, wenn ich mehr als 21 Zeichen eingebe :|
Hmm, sollte wohl noch ne Abfrage einbauen ;D
Ja, das gibt einen Bufferoverflow. :D

Und scanf und würde ich generell nicht benutzen da diese Funktion nicht idiotensicher ist. Auch zum Testen würde ich das nicht benutzen denn diese Funktion kann unvorhergesehene Ergebnise produzieren wenn man was 'Falsches' eingibt.

Exxtreme
2005-04-13, 17:04:25
Super, danke für die schnelle Antwort


Hmm, aber keine Lösung? Wie kann ich das umgehen :confused:
Schreib dir eine eigene Funktion. :)

Gangstaslida
2005-04-13, 17:04:53
Eine Möglichkeit wäre, mit cin zu arbeiten. Ist aber soweit ich weiss c++ only, oder? :redface:

Coda
2005-04-13, 17:08:43
Ja und dann am besten gleich std::string benutzen. Das wäre die absolut beste Lösung ;)

Gangstaslida
2005-04-13, 18:11:01
Hmm, wieso klappt den das wieder nicht?
#include <iostream>


int main()
{
char name[1024]
cout<<"Gesammter Name?"<< endl;
cin>>name;
cout<<"Dein Name ist: "<< name;

return 0;
}

Eluskio:~/Desktop/network Eluskio$ gcc a.cpp
a.cpp: In function `int main()':
a.cpp:7: error: parse error before `<<' token
a.cpp:8: error: `cin' undeclared (first use this function)
a.cpp:8: error: (Each undeclared identifier is reported only once for each
function it appears in.)
a.cpp:9: error: `cout' undeclared (first use this function)
a.cpp:11: error: parse error before `return'

gcc meint cin und cout seien variabeln :|

Trap
2005-04-13, 18:14:57
using namespace std;
oder
std::cout, std::cin, std::endl

benutzen. Außerdem sollte man cin>> nicht mit char-arrays als Puffern benutzen, das gibt die gleichen Probleme wie mit scanf (sowohl Pufferüberlauf als auch Stop an Leerzeichen).

std::string name;
std::getline(std::cin,name);
//oder
char name[bufsize];
std::cin.getline(name,bufsize);