Apostroph "printen"

Status
Nicht offen für weitere Antworten.
D

derweise

Gast
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).
 

faetzminator

Gesperrter Benutzer
Ein Anführungszeichen ausgeben:
Java:
System.out.println("\"");
// oder
System.out.println(anführungszeichen);

Deine letztere Frage versteh ich allerdings nicht...
 
D

derweise

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

Hallo. Ich verwende Eclipse und habe folgendes Problem:

Java:
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

Top Contributor
hö?
Java:
char apo = '\"';
String someStrangeWhatever = "print(''''" + apo + "'''' bli blub ); \"\" " + apo + " hallo wl";
System.out.println(someStrangeWhatever);
 
D

derweise

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

Java:
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:
Java:
"  	   println('"' + anführungszeichen + '"' + ';');",

Er zeigt den Fehler bei dem ersten '"' an....
 
Zuletzt bearbeitet von einem Moderator:

derweise

Aktives Mitglied
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:

origcode.jpg


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

1ausgabe.jpg
 
Zuletzt bearbeitet:
S

SlaterB

Gast
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...

Top Contributor
korrekt müsste diese Zeile so aussehen:
Code:
System.out.println('\''+ '\"' + ';');
Dabei würden aber drei chars addiert - char entspricht einer Ganzzahl
Gib einfach Strings aus, z.B so:
Java:
System.out.println("'"+ "\"" + ";");
 

derweise

Aktives Mitglied
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

Gib einfach Strings aus, z.B so:
Java:
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:

origcode3.jpg
 
S

SlaterB

Gast
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

Top Contributor
>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

Java:
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

Aktives Mitglied
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:

Java:
static char anführungszeichen = '"';

Nun habe ich folgende 2 Zeile:

Hier zeigt der Compiler den Fehler wegen den drei Apostrophen an:
Java:
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:
Java:
"  	   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?
 
Zuletzt bearbeitet:

Der Müde Joe

Top Contributor
Das " musst du escapen mit einem \

Java:
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 -->";
 

Michael...

Top Contributor
So wirklich verstanden, was Du da willst habe ich nicht aber vielleicht hilft ja folgendes:
Java:
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?
 

derweise

Aktives Mitglied
ausgegeben werden soll die deklaration von "anführungszeichen", also:
' " ' ;
 
Zuletzt bearbeitet:
S

SlaterB

Gast
meinst du so?:
Java:
    "  	   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
Java:
"      println(''' + anführungszeichen + ''' + ';');",
nun
Java:
"      println('\'' + anführungszeichen + '\'' + ';');",
wird, ganz einfache Korrektur, ohne " neu reinzubringen
 
S

SlaterB

Gast
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
 
S

SlaterB

Gast
bei
Java:
""+ '"' + 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[], ..
oder das was ich zuvor kritisiert habe: mehr " statt ' verwenden ;)
 

Landei

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

Java:
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

Aktives Mitglied
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 :)
 
S

SlaterB

Gast
ich werde es nicht fertig programmieren ;)

oder um mich ein weiteres Mal zu wiederholen
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,
 

derweise

Aktives Mitglied
am besten ich erkläre es mal anders:

das ist mein programm:

origcode2.jpg


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? :)
 
Zuletzt bearbeitet:

derweise

Aktives Mitglied
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 :D
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben