# Großbuchstaben überprüfen in C!



## binder0101 (1. Mai 2014)

Hallo, Ich hab grad ein Programm geschrieben dies eine Permutation und keine Permutation unterscheidet. Das Programm funktioniert supper jedoch muss ich nur mehr überprüfen ob die Zeichenkette groß geschrieben wurde, ich hab da einen Ansatz mit der Funktion "isupper" aus der Bibliothek <ctype.h> aber kann es nicht wirklich umsetzen könnt ihr mir vielleicht ein paar Tipps geben?

Beispiel:
a: ASDFGHJKLLJGDADGJGAL
b: AAASDDDFGGGGHJJJKLLL
b ist eine Permutation von a

Code:

```
//Includes
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
//Funktionen

void stringsort(char per1[], int laenge);
void stringsort2(char per2[], int laenge2);

//Hauptprogramm
int main(void){
//Variablendeklaration
int size1 = 0,size2 = 0;
long zahl = 0, zahl2 = 0;
char *eptr = NULL,nochmal='A';
char per1[61] = "";
char per2[61] = "";
int i = 0,j=0;

do{

do{

printf("a: ");
fgets(per1, sizeof(per1), stdin);
zahl = strtol(per1, &eptr, 10);
size1 = strlen(per1);

printf("b: ");
fgets(per2, sizeof(per2), stdin);
zahl2 = strtol(per2, &eptr, 10);
size2 = strlen(per2);

stringsort(per1, size1); //Sortieren des ersten Strings.
stringsort(per2, size2); //Sortieren des zweiten Strings.

} while (size1 != size2);

if (strcmp(per1, per2) == 0){ //Vergleich der beiden Zeichenketten
printf("Ja, ist eine Permutation!\n");
}
else{
printf("Nein, ist keine Permutation!\n");
}

printf("Wollen Sie das Programm erneut starten? (J/N)\n");
nochmal = getch();
} while (nochmal == 'j' || nochmal == 'J');
return EXIT_SUCCESS;
}


void stringsort(char per1[], int laenge){
int temp = 0, i = 0, j = 0; // Die Ablagerungsvariable "temp" (siehe weiter unten)

laenge = strlen(per1);
for (i = 0; i < laenge; i++){ // Lässt jedes Zeichen einmal die folgende Anweisung durchführen...
for (j = 0; j < laenge-1-i; j++){ // Jedes Zeichen wird mit jedem anderen Zeichen im String verglichen
if (per1[j] > per1[j + 1]){
temp = per1[j]; // Werte...
per1[j] = per1[j + 1]; // ...werden...
per1[j + 1] = temp; // ...getauscht.
}
}
}
}

void stringsort2(char per2[], int laenge2){
int temp = 0, i = 0, j = 0; // Die Ablagerungsvariable "temp" (siehe weiter unten)


laenge2 = strlen(per2);
for (i = 0; i < laenge2; i++){ // Lässt jedes Zeichen einmal die folgende Anweisung durchführen...
for (j = 0; j < laenge2 - 1 - i; j++){ // Jedes Zeichen wird mit jedem anderen Zeichen im String verglichen
if (per2[j] > per2[j + 1]){
temp = per2[j]; // Werte...
per2[j] = per2[j + 1]; // ...werden...
per2[j + 1] = temp; // ...getauscht.
}
}
}
}
```


----------



## Jennesta (1. Mai 2014)

Hallo binder0101,

ich habe ehrlich gesagt keine Lust deinen unformatierten Quelltext zu lesen. 
Aber Großbuchstaben befinden sich im ASCII Zeichensatz zwischen 65 und 90. Du könntest also jeden char im String prüfen ob er einen Wert zwischen eben diesen Grenzen hat. Nichts anderes macht auch die isUpper-Funktion.

Grüße,
Jennesta


----------



## binder0101 (1. Mai 2014)

Für die Formatierung kann ich nichts dafür die hat der Browser so komisch zusammengewürfelt, jedoch schaff ich das irgendwie nicht, komm nicht auf den algorithmus. Könnte mir einer noch ein paar Tipps geben ?


----------



## Hunter (1. Mai 2014)

Hallo, 

für die Formatierung die entsprechenden Codetags verwenden: [cpp ] [/ cpp]

Wie Jennesta schon schrieb, kannst du jedes Zeichen in deinem String überprüfen ob es ein Großbuchstabe ist. Die Großbuchstaben befinden sich zwischen 65 und 90. Dies kannst Du in einer Schleife abfragen lassen ob dies der Fall ist.


----------



## binder0101 (1. Mai 2014)

```
for (i = 0; i < size1; i++){
				for (j = 0; j < size1 - 1 - i; j++){
					if (per1 >= 65 && per1 <= 90){
						printf("a: ");
						fgets(per1, sizeof(per1), stdin);
						zahl = strtol(per1, &eptr, 10);
						size1 = strlen(per1);
					}
```
so irgendwie ich versteh nicht wie ihr das meint....

Hier nochmal ganzer code:

```
/*
Name:
Author:
Description:
Last Change:
*/

//Includes
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
//Funktionen

void stringsort(char per1[], int laenge);
void stringsort2(char per2[], int laenge2);

//Hauptprogramm
int main(void){
	//Variablendeklaration
	int size1 = 0,size2 = 0;
	long zahl = 0, zahl2 = 0;
	char *eptr = NULL,nochmal='A';
	char per1[61] = "";
	char per2[61] = "";
	int i = 0,j=0;

	
	
	
		
	do{
		
		do{
			for (i = 0; i < size1; i++){
				for (j = 0; j < size1 - 1 - i; j++){
					if (per1 >= 65 && per1 <= 90){
						printf("a: ");
						fgets(per1, sizeof(per1), stdin);
						zahl = strtol(per1, &eptr, 10);
						size1 = strlen(per1);
					}
			printf("b: ");
			fgets(per2, sizeof(per2), stdin);
			zahl2 = strtol(per2, &eptr, 10);
			size2 = strlen(per2);

			stringsort(per1, size1); //Sortieren des ersten Strings.
			stringsort(per2, size2); //Sortieren des zweiten Strings.
			
		} while (size1 != size2);
		
		if (strcmp(per1, per2) == 0){            //Vergleich der beiden Zeichenketten 
			printf("Ja, ist eine Permutation!\n");
		}
		else{
			printf("Nein, ist keine Permutation!\n");
		}

		printf("Wollen Sie das Programm erneut starten? (J/N)\n");
		nochmal = getch();
	} while (nochmal == 'j' || nochmal == 'J');
	return EXIT_SUCCESS;
}


void stringsort(char per1[], int laenge){
	int temp = 0, i = 0, j = 0;             // Die Ablagerungsvariable "temp" (siehe weiter unten)

	laenge = strlen(per1);
	for (i = 0; i < laenge; i++){           // Lässt jedes Zeichen einmal die folgende Anweisung durchführen...
		for (j = 0; j < laenge-1-i; j++){        // Jedes Zeichen wird mit jedem anderen Zeichen im String verglichen
			if (per1[j] > per1[j + 1]){
				temp = per1[j];    //    Werte...
				per1[j] = per1[j + 1];  // ...werden...
				per1[j + 1] = temp;  // ...getauscht.
			}
		}
	}
	
	
}

void stringsort2(char per2[], int laenge2){
	int temp = 0, i = 0, j = 0;             // Die Ablagerungsvariable "temp" (siehe weiter unten)
	

	laenge2 = strlen(per2);
	for (i = 0; i < laenge2; i++){           // Lässt jedes Zeichen einmal die folgende Anweisung durchführen...
		for (j = 0; j < laenge2 - 1 - i; j++){        // Jedes Zeichen wird mit jedem anderen Zeichen im String verglichen
			if (per2[j] > per2[j + 1]){
				temp = per2[j];    //    Werte...
				per2[j] = per2[j + 1];  // ...werden...
				per2[j + 1] = temp;  // ...getauscht.
			}
		}
	}





}
```


----------



## Hunter (1. Mai 2014)

Hier mal ein Beispiel:

```
int istGross = 0;
for(int i = 0; i < strlen(string); i++) {
    for(int j = 65; j <= 90; j++) {
        if(string[I] != j) //Überprüfe ob string[I] gleich einem Großbuchstaben ist
            istGross++; //Wenn nicht, dann istGross++
    }
}
```


----------



## binder0101 (1. Mai 2014)

Ok soweit hab ichs mal verstanden aber zu was benötige ich die 'istGross' Variable ? 
Oder was bedeuted der Wert der die 'istGross' Variable beinhaltet?


----------



## Hunter (1. Mai 2014)

_istGross_ wird immer um 1 erhöht, wenn ein Buchstabe im String kein Großbuchstabe ist.


----------



## binder0101 (1. Mai 2014)

und zu was ist das gut?


----------



## Hunter (1. Mai 2014)

Hallo, 

die Variable hab ich nur zur besseren Verständigung des Beispieles eingebaut.


----------



## binder0101 (2. Mai 2014)

Aber wie würde das mit der isupper Funktion funktionieren? Ich hab mir so überlegt ich mach eine do while schleife und lasse am schluss überprüfen "while (isupper(char String)==0);" 
dann läuft ja die schleife solange bis man nur großbuchstaben eingibt oder? Jedoch ist mein Problem das die isupper Funktion nur die Parameter 'int' akzeptiert. So meine Frage wie soll ich dann den String mit isupper überprüfen wenn die Parameter nur 'int Variablen (Zahlen)" sind?


```
char per1[61] = "";
do{
				printf("a: ");
				fgets(per1, sizeof(per1), stdin);
				zahl = strtol(per1, &eptr, 10);
				size1 = strlen(per1);
			} while (isupper(per1) == 0);
```


----------



## Jennesta (2. Mai 2014)

Hallo,

du kannst doch einfach den char in ein int casten. Binär gesehen ist ein char ja nichts anderes als ein int mit weniger Bytes, dessen Anzahl aber ausreicht um den ASCII-Zeichensatz darzustellen.


```
isupper(int(per1))
```


----------



## Hunter (2. Mai 2014)

Hallo, 

das liegt daran, dass ein _char_ auch eine Zahl zugewiesen werden kann. Dh. dass _char c = 'A';_ gleich _char c = 65;_ ist. Die Funktion überprüft nur ein einzelnes Zeichen, deshalb nimmt die Funktion auch nur einen _int_-Wert an.

Du könntest meinen Beispielcode verwenden, um zu ermitteln ob der eingegebene String nur Großbuchstaben entählt. Ansonsten kannst du auch dieses Beispiel verwenden: http://www.cplusplus.com/reference/cctype/isupper/


----------



## binder0101 (2. Mai 2014)

Hallo @Jannesta,

wenn ich den char in ein int caste bekomme ich einen Debugfehler und das Programm stürzt ab "Debug Assertion Failed!" 

Hallo @Hunter,
Ich weiß nicht wie ich den Beispielcode in meinem Programm anwenden soll und die Funktion die du mir per link geschikt hast macht statt aus dem String "Test String" --> "test string" in wiefern soll mir das weiter helfen?


----------



## Hunter (2. Mai 2014)

Du willst ja, dass der eingegebene String nur Großbuchstaben entählt, somit kannst du meinen Besipielcode gleich nach der Eingabe verwenden und somit überprüfen lassen ob der String nur Großbuchstaben entählt. Wenn _istGross_ gleich _0_ ist, dann sind nur Großbuchstaben im String. 
Das Beispiel von der Seite könntest du dann verwenden, wenn du die Kleinbuchstaben einfach in Großbuchstaben umwandeln willst. 

Hier mal ein Beispiel wie du die _isupper_-Funktion nutzen kannst:

```
char *string = "HALLO";
if(isupper(string[0]))
    ... //Hier geht dein Code weiter
```


----------



## binder0101 (2. Mai 2014)

So müsste sich die do while schleife solange wiederholen bis ich es großgeschrieben eingegeben habe nach meinen vorstellungen oder hab ich da etwas falsch verstanden?


```
do{
				printf("a: ");
				fgets(per1, sizeof(per1), stdin);
				zahl = strtol(per1, &eptr, 10);
				size1 = strlen(per1);

				for (i = 0; i < strlen(per1); i++) {
					for (j = 65; j <= 90; j++) {
						if (per1[i] != j) //Überprüfe ob string[i] gleich einem Großbuchstaben ist
							istGross++; //Wenn nicht, dann istGross++
					}
				}
			} while (istGross == 0);
```


----------



## Hunter (2. Mai 2014)

Hallo, 



> Wenn _istGross _gleich 0 ist, dann sind nur Großbuchstaben im String.


Dementsprechend also _while (istGross != 0);_


----------



## binder0101 (2. Mai 2014)

Jedoch wenn ich "(istGross != 0);"  als Bediengung habe wiederholt sich die Eingabe 'a:' immer wieder wie eine Endlosschleife...


----------



## Hunter (2. Mai 2014)

Hallo, 

Hab da einen kleinen Denkfehler gemacht: _while(istGross != (strlen(string)*25));_


----------



## binder0101 (2. Mai 2014)

wie bist du denn auf das gekommen? außerdem kommt noch immer wieder die Eingabe 'a:' wie vorher, es ist wie verhext


----------



## Hunter (2. Mai 2014)

Hallo, 

versuch mal selbst drauf zu kommen, solltest du dir als Programmierer auch angewöhen.

Der Fehler liegt darin, dass du nach _do {_, _istGross_ immer neu mit _0_ initialisieren musst.


----------

