2016-10-31 13 views
-2

Ich habe ein Problem mit meiner Ausrichtung. Dieses Mal möchte ich, dass mein Programm Wörter zurückgibt, die mit demselben Buchstaben enden und beginnen. Ich habe so etwas geschrieben, aber es scheint zufällige Wörter zurück zu geben.Programm, das Wörter zurückgibt, die mit demselben Buchstaben enden und beginnen

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

void main() 
{ 
    char str[100]; 
    int i, t, j, len; 

    printf("Enter a string : "); 
    scanf("%[^\n]s", str); 

    len = strlen(str); 
    str[len] = ' '; 

    for (t = 0, i = 0; i < strlen(str); i++) 
    { 
     if ((str[i] == ' ') && (str[i - 1] == str[0])) 
     { 
      for (j = t; j < i; j++) 
       printf("%c", str[j]); 
      t = i + 1; 
      printf("\n"); 
     } 
     else 
     { 
      if (str[i] == ' ') 
      { 
       t = i + 1; 
      } 
     } 
    } 
} 
+0

Verwenden strtok(), um die anfängliche Zeichenfolge mit Trennzeichen ‚‘ tokenize und dann ein, wenn dann else-Klausel verwenden, die wie folgt aussehen. char * test = "abcdefgha"; \t wenn (test [0] == test [strlen (test) - 1]) cout << test; Ich habe nicht einmal Ihre Schleifenlogik betrachtet. Und nur ein Tipp, versuchen Sie nicht, das Rad jedes Mal neu zu erfinden –

Antwort

1

Sie können strtok verwenden, um die Strings von stdin zu trennen, und dann einen Buchstabenprüfer auf jedes geparste Wort einzeln anwenden.

Etwas wie folgt aus:

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

#define MAXCHAR 100 

int is_start_end(char *word); 
void exit_if_null(void *ptr, const char *msg); 

int 
main(void) { 
    char str[MAXCHAR]; 
    char *word; 
    char **all_words; 
    int words_size = 1, word_count = 0; 
    int i, found; 

    all_words = malloc(words_size * sizeof(*all_words)); 
    exit_if_null(all_words, "initial Allocation"); 

    printf("Enter words(enter empty line to terminate):\n"); 
    while (fgets(str, MAXCHAR, stdin) != NULL && strlen(str) != 1) { 
     word = strtok(str, " \n"); 

     while (word !=NULL) { 
      if (words_size == word_count) { 
       words_size *= 2; 
       all_words = realloc(all_words, words_size * sizeof(*all_words)); 
       exit_if_null(all_words, "Reallocation"); 
      } 
      all_words[word_count] = malloc(strlen(word)+1); 
      exit_if_null(all_words[word_count], "Initial Allocation"); 

      strcpy(all_words[word_count], word); 

      word_count++; 

      word = strtok(NULL, " \n"); 
     } 
    } 

    printf("Words that have equal first and last letters:\n"); 

    found = 0; 
    for (i = 0; i < word_count; i++) { 
     if (is_start_end(all_words[i])) { 
      found = 1; 
      printf("%s\n", all_words[i]); 
     } 
     free(all_words[i]); 
     all_words[i] = NULL; 
    } 

    if (found == 0) { 
     printf("None Found\n"); 
    } 

    free(all_words); 
    all_words = NULL; 

    return 0; 
} 

int 
is_start_end(char *word) { 
    int len; 

    len = strlen(word); 

    if ((len == 1) || (tolower(word[0]) == tolower(word[len-1]))) { 
     return 1; 
    } 
    return 0; 
} 

void 
exit_if_null(void *ptr, const char *msg) { 
    if (!ptr) { 
     printf("Unexpected null pointer: %s\n", msg); 
     exit(EXIT_FAILURE); 
    } 
} 
1

Diese Linie entfernt den Nullabschluss der Zeichenfolge:

len = strlen(str); 
str[len] = ' '; 

somit die Saite nicht mehr vorhanden ist, was übrig bleibt, ist nur ein gewöhnlicher Array von Zeichen.

Der nächste Aufruf von strlen im Körper der for-Schleife führt zu undefiniertem Verhalten.

+0

Ich änderte den Aufruf zu strlen, aber es funktioniert sowieso nicht – Struziu

+0

@Struzi Es gibt mehrere Probleme mit dem Code. Ich schlage vor, Sie gehen durch den Code und finden sie. – 2501

+0

Oh, ich verstehe. Programm vergleicht das letzte Zeichen der Wörter mit dem ersten Zeichen einer ganzen Zeile. Habe ich recht? – Struziu

Verwandte Themen