2016-06-10 32 views
3

ich letzte Zeichen in Zeichenfolge zuerst löschen möchten, ich verwende strtok Funktion Meine Eingabe ist: "Hello World Yaho" Ich benutze " " als meine delimeterC in String letztes Zeichen löschen

Meine Erwartung dieses

Hell 
Worl 
Yah 
ist

Aber die tatsächliche Ausgabe ist dies

Hello 
Worl 
Yaho 

Wie Ith lösen kann ist ein Problem? Ich kann diese Ausgabe verstehen

dies mein Code

int main(int argc, char*argv[]) 
{ 
    char *string; 
    char *ptr; 
    string = (char*)malloc(100); 

    puts("Input a String"); 
    fgets(string,100,stdin); 

    printf("Before calling a function: %s]n", string); 

    ptr = strtok(string," "); 

    printf("%s\n", ptr); 

    while(ptr=strtok(NULL, " ")) 
    { 
     ptr[strlen(ptr)-1]=0; 
     printf("%s\n", ptr); 
    } 

    return 0; 
} 
+1

Das 'strtok' im while-Ausdruck sollte die letzte Anweisung im Schleifenkörper sein, und der while-Ausdruck sollte einfach' ptr! = NULL' überprüfen. – WhozCraig

+0

http://ideone.com/6u5odn – BLUEPIXY

Antwort

3

Dieses Programm löscht das letzte Zeichen jedes Wortes.

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

int main(int argc, char*argv[]){ 

    char *string; 
    char *ptr; 
    string = (char*)malloc(100); 
    puts("Input a String"); 
    fgets(string,100,stdin); 
    printf("Before calling a function: %s\n", string); 
    string[strlen(string)-1]=0; 
    ptr = strtok(string," "); 
    printf("%s\n", ptr); 
    while(ptr){ 
     ptr[strlen(ptr)-1]=0; 
     printf("%s\n", ptr); 
     ptr = strtok(0, " "); 
    } 
    return 0; 
} 

Sie müssen daran denken,

  1. die Zeichenfolge Trim von Newline Hinter
  2. Verwenden strtok richtig

-Test

Input a String 
Hello World Yaho 
Before calling a function: Hello World Yaho 

Hello 
Hell 
Worl 
Yah 
+0

Vorsicht. Es gibt ungeprüfte Fehlerpunkte, die zu * undefiniertem Verhalten * führen können. Die Überprüfung des Erfolgs von 'fgets' vor der Unterhaltung des Rests des Programms ist ziemlich kritisch. – WhozCraig

+0

'fgets()' kann in einigen Fällen einen Puffer ohne einen Zeilenumbruch zurückgeben: wenn die Datei am Ende keinen enthält oder wenn die Zeile länger ist, als der Puffer aufnehmen kann. Eine sicherere Methode, den Zeilenvorschub aus dem mit 'fgets' gefüllten Puffer zu trimmen, ist' string [p (strcspn (string, "\ n")] = '\ 0'; ' – chqrlie

+0

Vielen Dank!Ich muss über STRTOK-Funktion lernen, mehr! :) – JeongHyun

0

Da Sie die Delm als Raum gehalten es getrennte Tokens für Leerzeichen getrennt Wörter in der Zeichenfolge und C-Strings enthalten ihre letzte Zeichen schaffen als '\ 0' zB Nullzeichen, so löscht es das Zeichen und nicht das letzte Zeichen im Text.

check this out http://www.cprogramming.com/tutorial/c/lesson9.html

es stellt mich heraus, dass C-Strings sind immer mit einem Null-Zeichen beendet, buchstäblich eine '\ 0' (mit dem Wert 0),

1

Ihr Problem ist am besten gelöst, indem es in zwei Phasen aufgeteilt: Parsen der Satz in Worte einerseits mit strtok wenn Sie es wünschen, und das Drucken der Wörter mit ihren letzten Zeichen in einer separaten Funktion weggelassen:

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

static void print_truncated_word(const char *ptr) { 
    int len = strlen(ptr); 
    if (len > 0) len -= 1; 
    printf("%.*s", len, ptr); 
} 

int main(int argc, char*argv[]) { 
    char buf[128]; 
    char *ptr; 

    puts("Input a string: "); 
    if (fgets(buf, sizeof buf, stdin) == NULL) { 
     /* premature end of file */ 
     exit(1); 
    } 
    printf("Before calling a function: %s\n", string); 

    ptr = strtok(string, " \n"); 
    while (ptr) { 
     print_truncated_word(ptr); 
     ptr = strtok(NULL, " \n"); 
    } 
    return 0; 
} 

Hinweis dass die print_truncated_word Funktion den Puffer nicht ändert. Nebeneffekte auf Eingabeargumente sollten vermieden werden, es sei denn, sie sind das explizite Ziel der Funktion. strtok verhält sich in dieser Hinsicht unter anderen Mängeln wie seinem versteckten Zustand, der eine verschachtelte Verwendung verhindert, schlecht.

+0

Vielen Dank für Ihre Antwort! Ich muss über STRTOK-Funktion lernen, mehr! :) – JeongHyun