2017-03-04 3 views
0

Ein Ausschnitt aus einem Stück meines Codes. Meine Funktion unten akzeptiert Text vom Benutzer. Kehrt die gesamte Eingabe um und versucht dann, die ASCII-Darstellung der umgekehrten Zeichenfolge in einem Array namens ascii_array zu speichern. Wenn der Code jedoch steht, akzeptiert er nur das erste Zeichen der umgekehrten Zeichenfolge, erhöht und überschreibt die erste Position der ascii_array. Ich habe mehrere Möglichkeiten versucht, um den Zeiger zu erhöhen, um die Zeichen in ascii_array zu speichern, aber ich erhalte einen Fehler. Das Array sollte die ASCII-Darstellung der umgekehrten Zeichenfolge im ASCII-Array enthalten.C: Zeiger und Array

Beispiel: Eingabe: Hallo!

Ascii Darstellung des umgekehrten String: elloh

Erwartete Ausgabe: 33 111 108 108 101 104

Ausgang I erhalten: 33

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

void encrypt(char inputText[], int inputLength); 

int main(void) 
{ 
    char word[512]; 
    int length; 
    printf("Enter word: "); 
    fgets(word,512,stdin); 
    length = strlen(word); 
    encrypt(word,length); 
    return 0; 

} 

void encrypt(char inputText[], int inputLength) 
{ 

    printf("%s\n",inputText); 
    char *begin = inputText; 
    char *end = inputText + inputLength - 1; 
    char temp; 
    while(end > begin) 
    { 
     temp = *end; 
     *end-- = *begin; 
     *begin++ = temp; 

    } 

    char *ascii_pointer; 
    char temporary; 
    ascii_pointer = inputText + 1; 
    temporary = *ascii_pointer; 

    int *p; 
    int array[512]; 
    p = array; 
    while(ascii_pointer < inputText + inputLength) 
    { 
     printf("INPUTTEXT: ascii_pointer: %s\n " , ascii_pointer); 
     temporary = *ascii_pointer++; 
     printf("temporary: %c\n " , temporary); 
     *p = temporary++; 
     // I think my logic is incorrect fron this point. 
     //*p++ = temporary++; 
     //*p++; 
     printf("asci_pointer: %c\n " ,*p); 
     printf("ascii_array: %d\n ", *array); 
     printf("\n"); 
    } 

    printf("\n"); 
    printf("END: %p:%c\n", p, *p); 
    printf("END--- MAYBE GARBAGE VALUE: place holder: %c\n ",temporary); 
    printf("END: ascii_array: %d\n ", *array); 
    return; 

} 
+0

Bitte geben Sie eine [mcve]. Geben Sie auch die genaue Eingabe, die erwartete Ausgabe und die tatsächliche Ausgabe an. – kaylum

+0

Setzen Sie Klammern um post op ppinter Inkremente –

+0

Ist nicht '* p ++ = temporäre;' statt '* p = temporäre ++;' alles, was Sie suchen? – Dolda2000

Antwort

2

Ich mag eine haben Array von ganzen Zahlen. Weil ich später im Code Werte zu diesen ganzen Zahlen hinzufügen werde.

Wenn Sie ein char * in ein Array von ganzen Zahlen umwandeln wollen, ist nicht viel Arbeit zu tun. A char ist bereits eine 1-Byte-Ganzzahl. Sie können es einfach so lassen und rechnen.

Zum Beispiel ...

int main(void) { 
    char string[] = "Hello"; 

    // Iterate through the string using the pointer until we see null. 
    // It avoids having to use strlen() which scans the whole string. 
    for(char *tmp = string; tmp[0] != '\0'; tmp++) { 
     // Print the char as an integer. 
     printf("%d\n", tmp[0]); 
    } 
} 

$ ./test 
72 
101 
108 
108 
111 

Wenn Sie diese Zahlen manipulieren wollen, gehen Sie vor! Hier ist ein Beispiel, das jedem Zeichen 2 hinzufügt.

int main(void) { 
    char string[] = "Hello"; 

    // Iterate through the string using the pointer until we see null. 
    // It avoids having to use strlen() which scans the whole string. 
    for(char *tmp = string; tmp[0] != '\0'; tmp++) { 
     tmp[0] += 2; 
    } 

    puts(string); 
} 

$ ./test 
Jgnnq 

Denken Sie daran, dass char ein einziges Byte und kann nur speichern bis zu 127

Also alle Ihre Verschlüsselungsfunktion tun muss, ist die Zeichenfolge umkehren.

void encrypt(char inputText[], int inputLength) 
{ 
    printf("%s\n",inputText); 
    char *begin = inputText; 
    char *end = inputText + inputLength - 1; 
    char temp; 
    while(end > begin) 
    { 
     temp = *end; 
     *end-- = *begin; 
     *begin++ = temp; 

    } 
} 

Wenn Sie wirklich einen String in ein Array von ganzen Zahlen umwandeln möchten, wird eine einfache Schleife tun.

int main(void) { 
    char string[] = "Hello"; 

    // Allocate an integer array to hold each integer in the string. 
    // This ignores the null byte. 
    int *copy = malloc(strlen(string) * sizeof(int)); 

    size_t len = strlen(string); 

    // Simple iteration to copy the string. A char will always 
    // be smaller than an int so the assignment just works. 
    for(size_t i = 0; i < len; i++) { 
     copy[i] = string[i]; 
    } 

    // Print out each integer in the new array. 
    for(size_t i = 0; i < len; i++) { 
     printf("%d\n", copy[i]); 
    } 

    free(copy); 
} 
1

Sie sollten diesen Code versuchen und verstehen, wo Sie einige Fehler haben (siehe Kommentare):

void encrypt(char inputText[], int inputLength) 
{ 
    printf("%s\n",inputText); 
    char *begin = inputText; 
    char *end = inputText + inputLength - 1; 
    char temp; 
    while(end > begin) 
     { 
     temp = *end; 
     *end-- = *begin; 
     *begin++ = temp; 
     } 

    char *ascii_pointer; 
    char temporary; 
    // ascii_pointer = inputText + 1; => you miss the first character 
    ascii_pointer = inputText; 
    temporary = *ascii_pointer; 

    int *p; 
    int array[512]; 
    p = array; 
    while(ascii_pointer < inputText + inputLength) 
     { 
     printf("INPUTTEXT: ascii_pointer: %s\n " , ascii_pointer); 
     temporary = *ascii_pointer++; 
     printf("temporary: %c\n " , temporary); 
     // *p = temporary++; => you always write at the first array position 
     *p++ = temporary++; 
     printf("ascii_array: %d\n ", *array); 
     printf("\n"); 
     } 
    printf("\n"); 
    printf("END: %p:%c\n", p, *p); 
    printf("END--- MAYBE GARBAGE VALUE: place holder: %c\n ",temporary); 
    // printf("END: ascii_array: %d\n ", *array); => you print only the first array element 
    printf("END: ascii_array: "); 
    p = array; 
    while (p < array + inputLength) 
     printf("%d ", *p++); 
    printf("\n"); 
    return; 
} 

Was Sie geben für "Hallo!":

END: ascii_array: 33 111 108 108 101 104

In Zukunft sollten Sie versuchen, dies mit viel weniger Linien zu tun :)