使用循环反转C中的字符串

Reversing a string in C using loop

这里是初级程序员。我正在尝试从用户那里获取输入,将其反转并显示结果。出于某种原因,它打印的是空白而不是反转的字符串。我知道 array[i] 有正确的信息,因为如果我在行 for (int i=0; i<count; i++) 上使用这个循环,它会打印正确的字符。它只是没有反向打印。我没有得到什么?

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

int main(void)
{
    printf("Please enter a word: ");
    char *word = get_string();

    int count = strlen(word);

    char array[count];

    for (int i=0; i< count; i++)
    {
        array[i] = word[i];
    }

    for (int i=count-1; i==0; i--)
    {
        printf("%c ", array[i]);
    }
    printf("\n");
}
for (int i=0; i< count; i++)
{
    array[i] = word[i];
}

你遍历字符串并复制它,而不是反转它。

在您的 array 声明中还有一个微妙的错误正在等待,因为您没有为 '[=13=]' 字符终止符保留 space。将您的缓冲区作为 C 字符串传递给 printf,而不是逐个字符传递将具有未定义的行为。

所以要修复这两个特定错误:

char array[count + 1];
array[count] = '[=11=]';

for (int i = 0; i< count; i++)
{
    array[i] = word[count - i];
}

附带说明一下,对于这个小练习使用 VLA 可能意义不大,但对于较大的输入,它很可能会溢出调用堆栈。当心

// the header where strlen is
#include <string.h>

/**
 * \brief reverse the string pointed by str
**/
void reverseString(char* str) {
    int len = strlen(str);
    // the pointer for the left and right character
    char* pl = str;
    char* pr = str+len-1;
    // iterate to the middle of the string from left and right (len>>1 == len/2)
    for(int i = len>>1; i; --i, ++pl, --pr) {
        // swap the left and right character
        char l = *pl;
        *pl = *pr;
        *pr = l;
    };
};

然后调用函数:

int main(void) {
    printf("Please enter a word: ");
    char *word = get_string();

    // Just call the function. Note: the memory is changed, if you want to have the original and the reversed just use a buffer and copy it with srcpy before the call
    reverseString(word)
    printf("%s\n", word);
};

然后改变

char array[count];

for (int i=0; i< count; i++)
{
    array[i] = word[i];
}

// add an other byte for the null-terminating character!!!
char array[count+1];
strcpy(array, word);