简体   繁体   中英

How to shift characters in a String in C?

How can I shift characters in a string to the right? For Example I want to shift every letter of "Hello" 3 times to the right. The ending letter starts at the beginning. So the output should be "lloHe".

I tried to do it with a pointer. But the output is just "k". The program just takes the "h" from the hello and shifts it 3 digits to the right from the alphabet. But thats not what I intended to do. Any tips you can give me?

#include <stdio.h>


int main () {
    int a[5] = {'h','e','l', 'l','o','\0'};
    char i;
    char ptr;

    ptr = a;
    printf ("%c\n",ptr+3);

    return 0;

}

Do you actually want to manipulate the data, or just produce the output? You could do something like:

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

int
main(int argc, char **argv)
{
    char a[] = {'h', 'e', 'l', 'l', 'o', '\0'};  /* Note the [], and the type */
    char i;
    char *ptr;    /* Note the '*'; ptr is a pointer */

    ptr = a;
    int shift = argc > 1 ? strtol(argv[1], NULL, 10) : 3;

    shift %= sizeof(a);

    printf("%s", ptr + shift);   /* Note the %s */
    fwrite(a, 1, shift, stdout);
    putchar('\n');

    return 0;
}

Usually, the initialization would be written char a[] = "hello"; , and if you make a an array of int, you cannot use printf to do output. If you need a to be ints for some reason, you could do:

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

int
main(int argc, char **argv)
{
    int a[] = {'h','e','l', 'l','o','\0'};
    int shift = argc > 1 ? strtol(argv[1], NULL, 10) : 3;
    shift %= sizeof a  / sizeof *a;
    int *ptr = a + shift;

    /* Print the tail of the string */
    while( ptr < a + sizeof a / sizeof *a ){
        putchar(*ptr++);
    }
    /* Print the head of the string */
    ptr = a;
    while( ptr < a + shift ){
        putchar(*ptr++);
    }
    putchar('\n');
    return 0;
}
int a[5] = ...
char ptr;
ptr = a;

Here a is a pointer to int . Assigning it to a variable of type char is not a correct thing to do. Compilers should emit a warning on that. Don't ignore warnings: they usually indicate that there is something wrong in your code!

You probably intended to use int * instead of char :

int a[5] = ...
int *ptr;
ptr = a;

With this code, shifting the pointer will work: ptr+3 does what you want.


To print one character at a pointer, dereference the pointer first:

printf ("%c\n", *(ptr+3)); // alternative spelling: ptr[3]

If you don't dereference, the compiler will warn you that the code is incorrect.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM