2016-07-03 11 views
-6
int i=0,j=0; 

char string[100], string2[100]; 
scanf("%s",&string); 

while (string[i]!='\0'){ 
    if(string[i]=='a' || string[i]=='e' || string[i]=='i' || string[i]=='o' || string[i]=='u' || string[i]=='A' || string[i]=='E' || string[i]=='I' || string[i]=='O' || string[i]=='U'){ 
     string[i]=string2[j]; 
    } 
    string[i] = tolower(string[i]); 
    string[i] = string2[j]; 
    string2[j-1]='.'; 
} 
printf("%s", string2); 

return 0; 

Die Frage ist ein Wort eingeben und dann alle Vokale entfernen, Hinzufügen von "." nach jeder Konstante und alle Großbuchstaben klein geschrieben.Probleme mit C-Programm leer Ausgang

+5

Das Programm wird nicht beendet, weil 'i' nirgends inkrementiert wird. - Was ist mit einem * Debugger *, um Ihr Problem zu lokalisieren? –

+2

... und 'string2 [j-1] = '.';' Beim ersten Speichern ruft undefiniertes Verhalten auf, da 'j '' 0 'ist und der resultierende Index' -1 'ist. Außerdem erhöhst du niemals "j", auch wenn du deine Figur abspeicherst. Und 'string [i] = string2 [j];' sieht mehr wie eine Vermutung als alles andere aus, da es sofort den Wert überschreibt, den Sie in der vorherigen Zeile mit * indeterminate * Inhalt gespeichert haben, da 'string2 [j]' nie war initialisiert. Kurze Antwort: Hören Sie auf zu raten und überprüfen Sie Ihr Material erneut. – WhozCraig

+1

Also was ist in 'string2'? Und warum nach 'string [i] = tolower (string [i]);' überschreibst du sofort string [i] '? –

Antwort

1

Da string ist ein Array, Sie nicht & verwenden, wenn es um scanf() vorbei, das gibt Ihnen einen Doppelzeiger und ist ein Fehler. Jedes Mal wenn Sie sich mit einer 10 Klausel if Aussage finden, fragen Sie nur nach Problemen (z. B. leicht durch Tippfehler zu stolpern.) Sie können diesen Test mit index() und eine Zeichenfolge, die alle Vokale enthält, vereinfachen. Es würde nicht schaden, einen Kommentar zu schreiben, wenn Sie Ihren Code schreiben, um anzugeben, welche der Anforderungen jeder Abschnitt implementiert. Die Variable i muss jedes Mal um die Schleife erhöht werden, die Variable j muss jedes Mal inkrementiert werden, wenn ein neues Zeichen zu string2 hinzugefügt wird. Nach der scanf(), sollten Sie nicht in string zuweisen, behandeln Sie es als lesen Sie nur, nur in string2 zuweisen. Und j-1 sollte nicht passieren. Schließlich, da string2 nicht initialisiert wird, kann sich darin Müll befinden, und Sie haben ihn nicht null beendet. Dass sie alle zusammen:

#include <ctype.h> 
#include <stdio.h> 
#include <strings.h> 

#define VOWELS "AEIOUaeiou" 

int main() 
{ 
    char string[100], new_string[100] = { 0 }; 

    // enter a word 
    scanf("%s", string); 

    for (int i = 0, j = 0; string[i] != '\0'; i++) 
    { 
     // remove all vowels 
     if (index(VOWELS, string[i]) == NULL) 
     { 
      // make all upper case letters lower case 
      new_string[j++] = tolower(string[i]); 

      if (isalpha(string[i])) 
      { 
       new_string[j++] = '.'; // add '.' after every consonant 
      } 
     } 
    } 

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

    return 0; 
} 

Ich gehe davon aus „nachdem jeder Konstante“ „nach jedem Konsonanten“ zu lesen war gemeint, sonst bitte klären, was Sie von Konstante bedeuten.