2017-02-22 6 views
0

Dies ist eine ganz andere Frage. DER ANDERE IST URL-SPEZIFISCHE MEINE IST NICHT. Das war nur ein Beispiel.Wie formatiert man eine vom Benutzer eingegebene Zeile?

Also hier ist mein Code:

main() 
{ 
     char input[150];                  //Create a variable of type char named input to store user input 

     printf(" Enter a standard line: ");              //Ask the user for some standard input 

     if (fgets(input, 150, stdin) == NULL)             //Initiate a series of checks to make sure there is valid input 
     { 
       puts(" End-of-File or Input Error Detected. ");         //If the end of the file is reached or there is a problem with input output a message 
     } 
     else if (input[0] == '\n')                //If the user neglected to enter anything output a message 
     { 
       puts(" Oops! Looks like you forgot to enter something! "); 
     } 
     else 
     { 
       printf(" Here's what you entered: %s ", input);         //If there is valid user input echo it back to the user 

      int i = 0; 
      while (input[i] != '\n') 
      { 
        if (input[i] = '/') 
          putchar("%2F"); 
        i++ 

      } 

     } 
} 

Ich habe die Eingabezeile entsprechend mit ihrem ASCII-Code durch Ersetzen bestimmte Zeichen zu ersetzen und zu justieren.

Zum Beispiel: 1. Benutzereingaben: google.COM/search?client
2. Programmänderungen und Drucke zurück an den Benutzer als: GOOGLE.com% 2FSEARCH% 3FCLIENT

Aber das System gibt mir Diese lange Fehlermeldung, wenn ich versuche, meinen Code zu kompilieren.

/home/cs/carroll/cssc0154/One/p1.c: In function 'main': 
/home/cs/carroll/cssc0154/One/p1.c:41:5: warning: passing argument 1 of 'putchar' makes integer from pointer without a cast [enabled by default] 
    putchar("%2F"); 
    ^
In file included from /home/cs/carroll/cssc0154/One/p1.c:15:0: 
/usr/include/stdio.h:580:12: note: expected 'int' but argument is of type 'char *' 
extern int putchar (int __c); 

Wo falsch gehe ich?

+2

' "% 2F"' ist ein bisschen länger als ein Zeichen ... –

+0

@EugeneSh. Ich verstehe das. Aber ich soll Symbole wie "/" durch ihre ASCII-Codes ersetzen, also kann es nicht wirklich geholfen werden, oder? – Polly

+1

Verwenden Sie dann die richtige Funktion, um mehr als ein Zeichen zu drucken. Sie haben bereits 'puts' und' printf' verwendet. –

Antwort

0

Sie versuchen, 3 Zeichen "%" 2 "" an eine Funktion putchar() zu übergeben, die ein Zeichen erwartet.

Betrachten printf("%%2f") statt putchar("%2f") verwenden, müssen Sie die gleiche Ausgabe in stdout erhalten.

Hinweis: Sie müssen das Prozentzeichen in printf mit (%) umgehen.

+0

Also habe ich 'puts ("% 2f ");' verwendet, aber es hat am Ende die ganze Zeile ersetzt und nur '% 2F' ausgedruckt. – Polly

+0

Nun, das ist unerwartet. putchar() akzeptiert anscheinend das Zeichen in Form eines "int" (normalerweise 4 Bytes). Du bist ein String: "% 2f" hat 3 Zeichen und automatisch angehängtes Terminator '\ 0' für String-Literale, deshalb bekommst du keinen Fehler und kannst wahrscheinlich kompilieren. Aber Sie erhalten zumindest eine Warnung vom Compiler. Das Ergebnis des Aufrufs der Funktion 'putchar()', die eindeutig ein Zeichen erwartet, ist unerwartet, wenn Sie mehr als eins übergeben. – Fredster

+0

Hmm ich sehe. Was für ein Rätsel. Nun, wissen Sie, wie man eine lange Reihe von Benutzereingaben faltet? Wie nach einer bestimmten Anzahl von Zeichen bricht es in eine neue Zeile. – Polly

0

Da ich die Punkte nicht auf die oben Kommentar ...

Hintergrund:

  • C haben nicht wirklich ‚Strings‘ - es hat Zeiger auf Zeichen, die sie behandelt sehr ähnlich wie Arrays.
  • Standardbibliotheksfunktionen erwarten, dass der letzte Wert im Array '\ 0' ist, und sie verarbeiten die Zeichen weiter, bis eines dieser 'Nullzeichen' gelesen wird.

dieser Zeile:

putchar("%2F"); 

gibt einen Zeiger (char *) auf 'putchar()' anstelle einer ganzen Zahl.

Die Warnung weist einfach auf den Typenkonflikt hin, weil es unwahrscheinlich ist, dass Sie das beabsichtigen. (Es ist richtig, das ist ein schwerwiegender Fehler, der abstürzen oder Sicherheitslücken verursachen kann, je nachdem wie die aufgerufene Funktion funktioniert)

Die meisten Maschinen/Compiler heutzutage sind LP64. Das bedeutet, dass 'putchar()' eine 32-Bit-Ganzzahl erwartet und Sie einen 64-Bit-Zeiger bereitstellen.

Der Grund dieses Code:

int i = 0; 
while (input[i] != '\n') 
{ 
    if (input[i] == '/') 
     puts("%2F"); 
    i++  
} 

druckt "% 2F" (ich nehme an dem Eingang "google.COM/search?client" genannt), weil er findet '/' einmal, und druckt die Zeichenfolge, die Sie "% 2F" angegeben haben. Kein anderes Zeichen führt eine Druckanweisung aus.
Wenn Sie hinzugefügt:

int i = 0; 
while (input[i] != '\n') 
{ 
    if (input[i] == '/') 
     puts("%2F"); 
    else 
     putc(intput[i]); 
    i++  
} 

Sie

google.COM%2F 
search?client 

weil puts() druckt eine neue Zeile erhalten würde ('\ n') nach seinem Eingang Druck.

Um dies zu vermeiden, müssen Sie eine andere Ausgabefunktion auswählen. Obwohl viele Optionen verfügbar sind, ist printf() wahrscheinlich das beste und sicherlich das am meisten erkennbare.

printf() druckt ‚formatiert‘ Text, der ‚%‘, um anzuzeigen, Formatierungsoptionen verwendet, so das Drucken eines einzelnen ‚%‘ erfordert, dass Sie zu ‚entkommen‘ es sieht aus wie die „%%“

Hier ist ein Arbeitsbeispiel für das, was Sie versuchen zu tun. I ersetzt, was einen großen Block sein muss

if (input[i] == 'CHAR') printf("%%XX"); 
else if (input[i] == ... 

von in einem String alle Sonderzeichen setzen. Ich überprüfe einfach, ob diese Zeichenfolge jedes Zeichen enthält, das ich drucken möchte.

Wenn das Zeichen gefunden wird, drucke ich ein '%', gefolgt von dem Hexadezimalwert des Zeichens. Der "% 02X" teilt printf() mit, dass er den Hexadezimalwert mit mindestens 2 Zeichen schreiben und 0 vorangestellt werden soll, wenn er den Wert auffüllen muss. Im Grunde wird es nie "9" schreiben, sondern "09" schreiben.

Sie könnten auch die Funktionen isalpha() ... isalphanum() ... ispunct() verwenden, um zu bestimmen, welche Arten von Zeichen Sie codieren sollten.

#include <stdio.h> 
#include <string.h> 

int main(int argc, char ** argv) 
{ 
    char *decodeStr = "/:\\+"; 
    int decodeLen = strlen(decodeStr); 

    while(--argc >= 0 && ++argv && *argv){ 
     char *str = *argv; 
     for(int i = 0; str[i] != '\0'; i++){ 
      if (NULL != memchr(decodeStr, str[i], decodeLen)) 
       printf("%%%02X", str[i]); 
      else 
       putchar(str[i]); 
     } 
     putchar('\n'); 
    } 
    return 0; 
} 

Beispiel Lauf:

./test http://google.com/atest+with+things 
http%3A%2F%2Fgoogle.com%2Fatest%2Bwith%2Bthings 
+0

Oh mein Gott, vielen Dank! Ich werde es jetzt versuchen! – Polly

+0

Also für die Zwecke dieser Klasse muss ich einen GCC-Compiler verwenden und anscheinend nicht für Schleifen. Danke für Ihre Hilfe. Vielleicht kann ich den Code irgendwie optimieren, so dass der gcc-Compiler es mag. Lol. – Polly

+0

@Polly gcc sollte keine Probleme damit haben. Welchen Fehler hast du bekommen? (Wenn es etwas über "'für' initiale Schleifen-Deklarationen" gibt, versuchen Sie, '--std = c99' an gcc zu übergeben oder die Deklaration von 'int i' aus der Schleife zu entfernen. Die Fähigkeit, Variablen innerhalb von Loop-Headern zu deklarieren t in der Sprache ursprünglich und gcc verwendet standardmäßig den alten Standard.) – Ray

Verwandte Themen