使用循环反转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);
这里是初级程序员。我正在尝试从用户那里获取输入,将其反转并显示结果。出于某种原因,它打印的是空白而不是反转的字符串。我知道 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);