# Apostroph "printen"



## derweise (17. Nov 2009)

Hallo. Ich verwende Eclipse und habe folgendes Problem:

println(''' + anführungszeichen + ''' + ';');

die Variable Anführungszeichen habe ich vorhin als: ' " ' deklariert.

so nun möchte, ich dass der Compiler auf der Console durch den print-Befehl folgendes ausgibt:

'"'. (Also soll er einfach die Deklaration des "anführungszeichens ausgeben) Da macht der Compiler einen Fehler. Er meint, dass drei Apostrophe: ''' hintereinander im print Befehl nicht gehen? Was kann ich da machen?

Außerdem habe ich in einem String ein Element, dass der Zeile des println's Befehls aussieht. D.h. wenn sich die println-Zeile ändert, muss auch das String Element dementsprechend geändert werden.
Noch sieht es so aus:
"  	   println(''' + anführungszeichen + ''' + ';');",   
(Im String sieht der Compiler keinen Fehler).


----------



## Der Müde Joe (17. Nov 2009)

so:

```
System.out.println('\"');
System.out.println("\"\"\"");
```


----------



## faetzminator (17. Nov 2009)

Ein Anführungszeichen ausgeben:

```
System.out.println("\"");
// oder
System.out.println(anführungszeichen);
```

Deine letztere Frage versteh ich allerdings nicht...


----------



## derweise (17. Nov 2009)

ich habe viele Rechtschreibfehler gemacht, ich schreibe es noch mal sauber hin:

Hallo. Ich verwende Eclipse und habe folgendes Problem:


```
println(''' + anführungszeichen + ''' + ';');[code=Java]

die Variable "Anführungszeichen" habe ich par zeilen vorher als: ' " ' deklariert.

so nun möchte, ich dass der Compiler auf der Console durch den print-Befehl folgendes ausgibt:

'"'. (Also er soll einfach die Deklaration des "anführungszeichens" ausgeben. Da macht der Compiler aber einen Fehler. Er meint, dass drei Apostrophe: ''' hintereinander im print Befehl nicht gehen. Was kann ich da machen?

Außerdem habe ich im Programm auch noch in einem String ein Element, dass wie die Zeile des println's Befehls aussieht. D.h. wenn sich die println-Zeile ändert, muss auch das String Element dementsprechend geändert werden.
Noch sieht es so aus:
[code=Java]" println(''' + anführungszeichen + ''' + ';');",
```
(Im String sieht der Compiler keinen Fehler).


----------



## Der Müde Joe (17. Nov 2009)

hö?

```
char apo = '\"';
String someStrangeWhatever = "print(''''" + apo + "'''' bli blub ); \"\" " + apo + " hallo wl";
System.out.println(someStrangeWhatever);
```


----------



## derweise (17. Nov 2009)

ok nun kommt beim compilen folgendes raus (es geht um eine Aufgabe, in der das programm seinen eigenen quellcode ausgibt [quine]):


```
public class Myself {
  static String[] me = {
    "public class Myself {",
    "  static String[] me = {",
    "  };",
    "  static char anführungszeichen =",
    "  public static void main(String argv[]) {",
    "    for (int i = 0; i < 2; i++)",
    "      println(me[i]);",
    "    for (int i = 0;i<me.length;i++) {",
    "      for (int j = 0; j < 4; j++)",
    "        print(' ');",
    "      print(anführungszeichen + me[i] + anführungszeichen);",
    "      println(',');",
    "    }",
    "    for (int i = 2; i <= 3; i++)",
    "      println(me[i]);",
    "	 for (int i = 0; i < 4; i++)",
    "    	print(' ');",
    "  	   println('"' + anführungszeichen + '"' + ';');",
    "    for (int i = 4; i < me.length; i++)",
    "      println(me[i]);",
    "  }",
    "}",
  };
  static char anführungszeichen =
    161
  public static void main(String argv[]) {
    for (int i = 0; i < 2; i++)
      println(me[i]);
    for (int i = 0;i<me.length;i++) {
      for (int j = 0; j < 4; j++)
        print(' ');
      print(anführungszeichen + me[i] + anführungszeichen);
      println(',');
    }
    for (int i = 2; i <= 3; i++)
      println(me[i]);
	 for (int i = 0; i < 4; i++)
    	print(' ');
  	   println('"' + anführungszeichen + '"' + ';');
    for (int i = 4; i < me.length; i++)
      println(me[i]);
  }
}
```

Nun muss ich die Ausgabe erneut kompilieren, aber nun zeigt der String mir einen Fehler an:

```
"  	   println('"' + anführungszeichen + '"' + ';');",
```

Er zeigt den Fehler bei dem ersten '"' an....


----------



## Der Müde Joe (17. Nov 2009)

>es geht um eine Aufgabe, in der das programm seinen eigenen quellcode ausgibt 

hier gucken:
http://www.java-forum.org/java-basics-anfaenger-themen/91497-java-code-konsole-ausgeben.html


----------



## derweise (17. Nov 2009)

Hallo. Ja der Typ scheint von meinem Semester zu sein  Aber mein Tutor hat die Aufgabe um einges erweiter:
Es gibt einen Quellcode--> Die 1. Ausgabe muss nicht gleich dem Quellcode sein--> Die 1. Ausgabe wird kompiliert--> die 2. Ausgabe MUSS gleich der 1. Ausgabe sein!
Darum habe ich das Problem mit dem Apostroph. Nach euren Verbesserungen sieht es so aus:

Originalcode:







1. Ausgabe ( die aber einen Fehler enthält. Es soll anstatt der Zahl immernoch die Deklaration: '\" ' stehen.


----------



## SlaterB (17. Nov 2009)

Semikolon fehlt?..


----------



## derweise (17. Nov 2009)

nein er wandelt einfach '\" ' einfach in die unicode zahl um. das will ich aber verhinden, aber wie?


----------



## derweise (17. Nov 2009)

Ich glaube, für euch wäre es einfacher dieses Problem zu lösen, als das obere:


----------



## SlaterB (17. Nov 2009)

weiß nicht wo du jetzt gerade bist, aber das Problem war, dass bei
> '"' + anführungszeichen + '"'
drei chars zu einem int-Wert zusammengerechnet wurden, 
vermeiden kann man das, indem man am Anfang noch "" dazuschreibt (leerer String aus zwei doppelten Anführungszeichen,
bei ""+ '"' + anführungszeichen + '"' wird jeder char dann im richtigen Sinne hinzugefügt,
aber das macht dir sicher paar neue Probleme,

ansonsten auch
String st = zeichen1;
st += zeichen2;
usw.
oder String.valueOf(char) einbauen oder ein char[], ..

-----

zum neuen Post:
''' (drei einfache Anführungszeichen) geht nicht, das muss '\'' lauten


----------



## Michael... (17. Nov 2009)

korrekt müsste diese Zeile so aussehen:  
	
	
	
	





```
System.out.println('\''+ '\"' + ';');
```
Dabei würden aber drei chars addiert - char entspricht einer Ganzzahl
Gib einfach Strings aus, z.B so:

```
System.out.println("'"+ "\"" + ";");
```


----------



## derweise (17. Nov 2009)

SlaterB hat gesagt.:


> zum neuen Post:
> ''' (drei einfache Anführungszeichen) geht nicht, das muss '\'' lauten



Dann erscheint aber, nach dem komplieren, hinter "anführungszeichen" = wieder eine ganze Zahl



Michael... hat gesagt.:


> Gib einfach Strings aus, z.B so:
> 
> ```
> System.out.println("'"+ "\"" + ";");
> ```



Im Programm ist oben ein String, der die unteren Zeilen als Element enthaltet. Die müssen nach der Änderung auch geändert, werden. Dann gibt der String oben aber, wegen den anführungszeichen, einen fehler:


----------



## SlaterB (17. Nov 2009)

derweise hat gesagt.:


> Dann erscheint aber, nach dem komplieren, hinter "anführungszeichen" = wieder eine ganze Zahl


das habe ich doch davor alles erklärt, wie die chars zusammenaddiert werden



> Im Programm ist oben ein String, der die unteren Zeilen als Element enthaltet. Die müssen nach der Änderung auch geändert, werden. Dann gibt der String oben aber, wegen den anführungszeichen, einen fehler:


niemand hat gesagt, es wäre leicht,

hier wurde erstmal nur deine Compilerfehler erklärt, 
dass die Kompletierung des Programms zu einer richtigen Ausgabe tricky ist, bleibt davon ungenommen,


----------



## Der Müde Joe (17. Nov 2009)

>Ich glaube, für euch wäre es einfacher dieses Problem zu lösen, als das obere:

Nich ganz trivial.

>Es gibt einen Quellcode--> Die 1. Ausgabe muss nicht gleich dem Quellcode sein--> Die 1. Ausgabe wird kompiliert--> die 2. Ausgabe MUSS gleich der 1. Ausgabe sein!

Wär doch gelach wenn wir das nicht schaffen. Also Quine als 
String --> Ausgeben. 
String --> Compilieren
Compilat laufen lassen


```
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;


public class SchoolSucks {

	public static void main(String... args) throws Exception {
		String quine = "class S{public static void main(String[]a){new S().p('\"',\"'\",\"class S{public static void main(String[]a){new S().p('\",\");}void p(char d,String q,String a,String b){System.out.println(a+d+q+','+d+q+d+','+d+a+d+','+d+b+d+b);}}\");}void p(char d,String q,String a,String b){System.out.println(a+d+q+','+d+q+d+','+d+a+d+','+d+b+d+b);}}";
		System.out.println(quine); // erste ausgabe;
		JavaObjectFromString sof = new JavaObjectFromString("S.java", quine);
		Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(sof);
		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
		CompilationTask task = compiler.getTask(null, null, null, null, null, fileObjects);
		// compile String
		System.out.println(task.call());
		// load class (hopefully in the same folder as running)
		Class<?> sClass = Class.forName("S");
		Method main = sClass.getMethod("main", new Class[] { String[].class });
		String[] mainArgs = {};
		main.invoke(null, (Object) mainArgs); // zweite Ausgabe vom der kompilierten ersten
	}

	static class JavaObjectFromString extends SimpleJavaFileObject {

		private final String code;

		protected JavaObjectFromString(String name, String source) throws URISyntaxException {
			super(new URI(name), Kind.SOURCE);
			this.code = source;
		}

		@Override
		public CharSequence getCharContent(boolean ignoreEncodingErrors) {
			return code;
		}
	}
}
```


----------



## derweise (17. Nov 2009)

Hmmmm verstehe nicht jetzt so ganz, was du da geschrieben hast.  Außerdem steht in der Aufgabenstellung, dass wir auf keine Dateien zugreifen dürfen... 

Ich stelle nun die Frage mal ganz banal:


```
static char anführungszeichen = '"';
```

Nun habe ich folgende 2 Zeile:

Hier zeigt der Compiler den Fehler wegen den drei Apostrophen an:

```
println(''' + anführungszeichen + ''' + ';');
```

die 2. Zeile (ist ein String): (der Inhalt der Klammer der ersten Zeile muss gleich dem Inhalt der Klammer der zweiten Zeile sein
Hier gibt es keine Fehler:

```
"  	   println(''' + anführungszeichen + ''' + ';');",
```

Also wie kann ich die erste Zeile ändern, damit ich dort keinen "Fehler" mehr habe, aber auch die 2. Zeile keinen Fehler nach der Änderung anzeigt?


----------



## SlaterB (17. Nov 2009)

'\''


----------



## Der Müde Joe (17. Nov 2009)

Das " musst du escapen mit einem \


```
char c = '\"';
//aber auch hier
String s = "bla \" <-- escape...hier ist er String fertig -->" + c + "<--hier fängt ein neuer an|| hier ist der neue fertig -->";
```


----------



## derweise (17. Nov 2009)

meinst du so?:

```
"  	   println(\"'"  + anführungszeichen + \"'"  + ';');",
```


----------



## Michael... (17. Nov 2009)

So wirklich verstanden, was Du da willst habe ich nicht aber vielleicht hilft ja folgendes:

```
char anfuehrungszeichen = '"';
System.out.println("'" + anfuehrungszeichen + "';");
System.out.println("\tso:");
System.out.println("println('" + anfuehrungszeichen + "';);");
System.out.println("\toder so:");
System.out.println("println(\"'\" + anfuehrungszeichen + \"';);");
System.out.println("\toder?????");
```
Oder Du schreibst was genau ausgegeben werden soll?


----------



## Der Müde Joe (17. Nov 2009)

man kann es rein an der Farbe sehen.

das 2te \ ist falsch


----------



## derweise (17. Nov 2009)

ausgegeben werden soll die deklaration von "anführungszeichen", also:
' " ' ;


----------



## SlaterB (17. Nov 2009)

derweise hat gesagt.:


> meinst du so?:
> 
> ```
> "  	   println(\"'"  + anführungszeichen + \"'"  + ';');",
> ```



du sprichst vielleicht nicht mir mir, aber generell frage ich mich, wieso ständig zwischen ' und " gewechselt wird,

mein Hinweis war jedenfalls, dass aus

```
"      println(''' + anführungszeichen + ''' + ';');",
```
nun

```
"      println('\'' + anführungszeichen + '\'' + ';');",
```
wird, ganz einfache Korrektur, ohne " neu reinzubringen


----------



## derweise (17. Nov 2009)

slater, bei deiner version fängt er an mit den chars zu rechnen...


----------



## SlaterB (17. Nov 2009)

das ist doch völlig unabhängig davon, nicht zwei Probleme vermischen,
zuerst hattest du um 15:39 nur nach dem Compilerfehler gefragt, der sollte nun erstmal geklärt sein,

dass chars zusammengerechnet werden ist was anderes, übrigens um 14:22 von mir auch schon beantwortet,
aber dagegen gibts natürlich mehrere Strategien


----------



## derweise (17. Nov 2009)

tut mir leid slater, dass ich da immer durcheinander komme. 
und die strategie wären?


----------



## SlaterB (17. Nov 2009)

SlaterB hat gesagt.:


> bei
> 
> ```
> ""+ '"' + anführungszeichen + '"'
> ...


oder das was ich zuvor kritisiert habe: mehr " statt ' verwenden


----------



## Landei (17. Nov 2009)

Leicht OT: Die kürzeste Lösung für einen Java-Quine, die ich kenne:


```
enum S{T;System y;String s=”enum S{T;System y;String s=%c%s%1$c;{y.out.printf(s,34,s);y.exit(0);}}”;{y.out.printf(s,34,s);y.exit(0);}}
```

Dort wird das Problem elegant umgangen, in dem man mit dem ASCII-Code 34 von " verwendet.


----------



## derweise (17. Nov 2009)

slater, kannst du mir mal den veränderten code senden? soll ich ihn dafür dir zusenden?
aber bitte beachte, dass die aufgabe heißt: der original-code erzeugt die ausgabe 1. diese kompiliert, erzeugt die ausgab 2. ausgabe 1 muss gleich der ausgabe 2 sein!

@landei: die aufgabenstellung ist etwas anders, als einfach nur einen quine schreiben


----------



## SlaterB (17. Nov 2009)

ich werde es nicht fertig programmieren 

oder um mich ein weiteres Mal zu wiederholen


SlaterB hat gesagt.:


> niemand hat gesagt, es wäre leicht,
> 
> hier wurden erstmal nur deine Compilerfehler erklärt,
> dass die Kompletierung des Programms zu einer richtigen Ausgabe tricky ist, bleibt davon ungenommen,


----------



## Michael... (17. Nov 2009)

derweise hat gesagt.:


> ausgegeben werden soll die deklaration von "anführungszeichen", also:
> ' " ' ;


Wird ja im ersten Fall ausgegeben. Ohne Variable geht's auch so:

```
System.out.println("'\"';");
```


----------



## derweise (17. Nov 2009)

am besten ich erkläre es  mal anders:

das ist mein programm:






Wenn ich dieses Programm kompilieren, dann erhalte ich als Ausgabe den exakt gleichen Quellcode. Dies muss man fortsetzen können. D.h. man soll die Ausgabe erneut kompilieren und die 2. Ausgabe soll exakt gleich mit der 1. Ausgabe sein. Wenn man die 2. Ausgabe kompiliert, soll die 3.Ausgabe exakt der 2. Ausgabe gleich sein usw....also es verändert sich nichts. Kein Apostroph oder Anführungszeichen verschwindet, oder taucht wieder auf...

Wäre da in meinem Programm nicht der Fehler, dann würde es exakt das gleiche ausgeben und es würde funktionieren. Also wie sollte ich AM BESTEN  die Apostrophe ändern, aber auch, dass die Ausgabe immer noch DIE VERÄNDERUNG ENTHÄLLT, und nicht die Veränderung durchführt? Versteht ihr?


----------



## derweise (17. Nov 2009)

ich habe geantwortet...
nebenbei: danke sehr, an alle die sich so viel mühle geben, einen hoffnungslosen fall wie mir, zu helfen 

es hat sich erledigt: ich habe einfach mit (char)34 gearbeitet und konnte dann die konstante variable anführungszeichen einfach rausschmeißen und fertig


----------

