|
Budada Bubladend
Anmeldungsdatum: Dez. 13, 2009
Beiträge: 634
|

10. Mai 2012 19:11
Hallo liebe C - Programmiere, ich drehe hier fast durch.
Ich wollte eigentlich nur kurz ein Programm schreiben, welches leider nach der ersten Eingabe nie weiter ging.
Als ich dem Problem auf den Grund gehen wollte, habe ich mal mit printf den Inhalt verschiedener Variablen überprüft, um sicher zu gehen, dass Bedingungen nicht daran scheitern.
Hierbei stellte sich heraus, dass bereits die erste Zuweisung nicht funktioniert, was ich einfach nicht verstehen will, denn es handelt sich hierbei wirklich um ein total einfaches Codebeispiel.
Ich dachte zwar den Fehler gefunden zu haben das Problem ist nur, dass der selbe Codeausschnitt ohne den Rest des Programms funktioniert! Hier einmal der Codesausschnitt, wie er funktioniert: #include <stdio.h>
int main (){
int var1 , wort , n=0 , i=0;
char index=0;
char a [ 100 ];
printf ( "Wort: " );
scanf ( "%s" , a );
wort=a[index];
printf ( "wort: %c\n" , wort );
for (index=0; wort !='\0'; index++){
wort=a[index];
}
index=index-1;
printf ( "Index: %d\n " , index );
}Und hier im Kontext zu dem Programm, welches bei der Ausführung nicht über das Einlesen der Eingabe bei Wort hinauskommt: #include <stdio.h>
int main (){
int var1 , wort , n=0 , i=0;
char index=0;
char a [ 100 ];
printf ( "Wort: " );
scanf ( "%s" , a );
wort=a[index];
printf ( "wort: %c\n" , wort );
for (index=0; wort !='\0'; index++){
wort=a[index];
}
//index=index-1;
printf ( "Index: %d" , index );
while ( i < index ){
// n=0;
if ( a[i] > a[i+1] ){
var1=a[i];
a[i]=a[i+1];
a[i+1]=var1;
n=n+1;
}
i++;
if ( i == index ){
if ( n > 0 ){
i=0;
} else
{
printf ( "%s" , a );
}
}
}
}
|
|
Vain
Anmeldungsdatum: April 12, 2008
Beiträge: 2242
|

10. Mai 2012 19:44
Servus, mal grundsätzlich: Das ist echt schwer lesbar. Wenn man seinen Code vernünftig formatiert, dann ist es auch leichter, die Übersicht zu behalten. Der hängt nicht im scanf. Du hast im zweiten Beispiel dein
| printf("Index: %d\n", index);
|
ohne ein „\n“ da stehen, deswegen wird die Zeile nicht ausgegeben. Tatsächlich verheddern tut er sich erst in der while-Schleife unten. Ich bin müde, was soll in der while-Schleife erreicht werden? Sollen wir dir überhaupt beim Debuggen dessen helfen oder ging es dir nur ums scanf?
|
|
Budada Bubladend
(Themenstarter)
Anmeldungsdatum: Dez. 13, 2009
Beiträge: 634
|

10. Mai 2012 19:56
hey, danke für deine Antwort. mal grundsätzlich: Das ist echt schwer lesbar.
Ja, ich weiß.. das ist noch eine meiner Schwächen...
Du hattest recht, dass hatte ich übersehen....
Ich bin müde, was soll in der while-Schleife erreicht werden? Sollen wir dir überhaupt beim Debuggen dessen helfen oder ging es dir nur ums scanf?
Öhm also für Hilfe bin ich nat. trotzdem Dankbar obwohl ich jetzt nat. die While - Schleife noch einmal unter die Lupe nehme.
Zur Erklärung: die While - Schleife soll Stelle i und Stelle i+1 des Arrays mit einander vergleichen und herausfinden, ob der Buchstabe an Stelle i größer ist als der andere, wenn dem so ist, sollen die beiden vertauscht werden (Ziel ist es, das Aray alphabetisch zu sortieren). Gruß
BB
|
|
sacridex
Anmeldungsdatum: Dez. 9, 2009
Beiträge: 89
|

10. Mai 2012 21:42
Hallo, habe deine Fehler gefunden. Einerseits ist deine Schleifenbedingung i < index, andererseits setzt du aber jedesmal i = 0, wenn i == index ist und das BEVOR der Schleifendurchgang endet, es wird also niemals zum Abbruch kommen, da immer i < index gelten wird. Andererseits tauscht du auch \0(das Ende des Strings, das ja durch eine 0 interpretiert wird, da int) nach vorne, da ja JEDER Buchstabe größer als Null ist. Überprüfe einfach immer nach EOF seperat, dann kannst du das umgehen.
|
|
Vain
Anmeldungsdatum: April 12, 2008
Beiträge: 2242
|

10. Mai 2012 22:43
Ach, Bubblesort. sacridex hat schon nicht ganz unrecht. EOF wirst du im String aber nicht finden. Du musst in jedem Durchlauf natürlich auch deine Statusvariable (bei dir „n“) zurücksetzen. Das hattest du seltsamerweise auskommentiert. Und eben nicht auch das Nullbyte anfassen, das muss am Ende stehenbleiben. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 | #include <stdio.h>
int main()
{
int i, nullat, sorted;
char a[100] = "";
char tmp;
/* Wort als String nach a einlesen. */
printf("Wort: ");
scanf("%s", a);
/* Länge des Strings bestimmen. Könnte man übrigens auch mit
* strlen() aus string.h machen. Beachte, dass das hier im
* wesentlichen ein Schleifenkopf ohne -rumpf ist. nullat enthält am
* Ende den Index der 0. */
for (nullat = 0; a[nullat] != 0; nullat++);
printf("strlen / null at: %d\n", nullat);
/* Bubblesort. */
sorted = 0;
while (sorted == 0)
{
/* Markiere zunächst als sortiert. Bleibt so, falls nichts
* unsortiertes mehr gefunden wird. */
sorted = 1;
/* Da auch a[i + 1] getestet wird, darf i nur bis zum vorletzten
* Zeichen laufen, sonst wird auch die 0 angefasst. Folglich
* hier "nullat - 1". */
for (i = 0; i < nullat - 1; i++)
{
if (a[i] > a[i + 1])
{
/* Unsortiertes Paar gefunden, markiere String als
* unsortiert und tausche aus. */
sorted = 0;
tmp = a[i];
a[i] = a[i + 1];
a[i + 1] = tmp;
}
}
}
printf("Sortiert: %s\n", a);
return 0;
}
|
„int“ ist übrigens der „natürliche“ Typ für Array-Indizes. Wenn du mit „-Wall -Wextra“ kompilierst (würde ich immer tun), spuckt das auch eine Warnung aus. Und ein „main()“ ohne „return“ ist auch nicht so toll, weil dann der Exit-Code des Programms mehr oder wenig dem Zufall überlassen wird. Tipp: „getline()“ ist eine schöne Funktion, die ich einem „scanf()“ vorziehen würde. Warum? Weil „getline()“ selbst einen Puffer allokiert, der groß genug ist, um den String ganz zu umfassen. Darauf kannst du dann immernoch ein „sscanf()“ oder ähnlich loslassen, wenn es sein muss.
|
|
sacridex
Anmeldungsdatum: Dez. 9, 2009
Beiträge: 89
|

10. Mai 2012 22:58
Ja, mit EOF meinte ich natürlich \0. Frage: Wie machst du das mit den „sscanf()“? Dass auch die Schrift kleiner ist?
|
|
Vain
Anmeldungsdatum: April 12, 2008
Beiträge: 2242
|

10. Mai 2012 23:02
sacridex schrieb: Ja, mit EOF meinte ich natürlich \0.
Verstehe. Ist halt nicht dasselbe („EOF“ ist eine Konstante aus „stdio.h“ und hat, soweit ich weiß, den Wert -1), deswegen ritt ich darauf herum.
Frage: Wie machst du das mit den „sscanf()“? Dass auch die Schrift kleiner ist?
Backticks. Klick mal bei einem Posting von mir auf „Zitieren“, dann siehst du es. Lustigerweise ist das unter Hilfe zur Syntax nicht erklärt – vielleicht ist es nicht gewollt, dass man das im Forum nutzt?
|
|
Lasall
Supporter & Wikiteam
Anmeldungsdatum: März 30, 2010
Beiträge: 7480
Wohnort: ~/Desktop
|

11. Mai 2012 02:05
Hi, kurze Zwischenbemerkung: Im Forum darf natürlich gerne Wikisyntax verwendet werden . Die Doku zur Monotype-Schriftart ist hier: Wiki/Syntax. Gruss
Lasall
|
|
Budada Bubladend
(Themenstarter)
Anmeldungsdatum: Dez. 13, 2009
Beiträge: 634
|

11. Mai 2012 05:42
Vielen Dank für die vielen Antworten! Einerseits ist deine Schleifenbedingung i < index, andererseits setzt du aber jedesmal i = 0, wenn i == index ist und das BEVOR der Schleifendurchgang endet, es wird also niemals zum Abbruch kommen, da immer i < index gelten wird.
Das verstehe ich nicht ganz! Wieso sollte dem denn so sein?
Ich setzt i ja nur auf 0, wenn i gleich groß ist wie der index (sprich, das array einmal durchlaufen wurde) und wenn n größer 0 ist (also noch etwas verändert wurde). Wenn dem nicht so ist, dann ist i ja nicht mehr kleiner als der index und somit tritt das else in Kraft und gibt das Array aus. Oder bin ich gerade so falsch gewickelt? if ( i == index ){
if ( n > 0 ){
i=0;
}
Das hattest du seltsamerweise auskommentiert. Und eben nicht auch das Nullbyte anfassen, das muss am Ende stehenbleiben.
Oh ja.. da habe ich einen starken Denkfehler gemacht!
Dankeschön...
Ich hatte angenommen, da der Index ja so Groß ist wie das Array, würde die Ascii-Null unberücksichtigt werden, da die Bedinungn i < index lautet. Hatte aber vergessen, dass die zweite Stelle ja i+1 ist  Vielen Dank für eure ganzen Hilfen! Gruß
BB
|
|
Panke
Anmeldungsdatum: Okt. 14, 2010
Beiträge: 113
|

11. Mai 2012 09:15
Vain schrieb: „int“ ist übrigens der „natürliche“ Typ für Array-Indizes. Wenn du mit „-Wall -Wextra“ kompilierst (würde ich immer tun), spuckt das auch eine Warnung aus. Und ein „main()“ ohne „return“ ist auch nicht so toll, weil dann der Exit-Code des Programms mehr oder wenig dem Zufall überlassen wird.
Warum gerade int und nicht size_t oder ptrdiff_t? siehe zum Beispiel hier
|
|
Vain
Anmeldungsdatum: April 12, 2008
Beiträge: 2242
|

11. Mai 2012 10:23
Panke schrieb: Vain schrieb: „int“ ist übrigens der „natürliche“ Typ für Array-Indizes. Wenn du mit „-Wall -Wextra“ kompilierst (würde ich immer tun), spuckt das auch eine Warnung aus. Und ein „main()“ ohne „return“ ist auch nicht so toll, weil dann der Exit-Code des Programms mehr oder wenig dem Zufall überlassen wird.
Warum gerade int und nicht size_t oder ptrdiff_t? siehe zum Beispiel hier
Weil mein Hirn auf Standby war. 
|