迭代地反转C中的字符串
Reversing a string in C iteratively
我正在尝试在 C 中反转字符串,我能够完成此操作但并非没有我不太了解的副作用。这是我反转字符串的代码:
void reverseString(char *toReverse, char *reverse) {
int i = strlen(toReverse);
int counter = 0;
for (i; toReverse[counter] != '[=10=]'; i--) {
reverse[i] = toReverse[counter];
counter++;
}
}
int main(int argc, char *argv[]) {
char reverse[strlen(argv[1]) + 1];
reverse[strlen(reverse)] = '[=10=]';
reverseString(argv[1], reverse);
printf("The reverse string is '%s'", reverse);
}
当给出一个字符串时,这会正确地反转字符串,但也会添加一些额外的数据,例如:
给定字符串 abc123
返回字符串 321cbaub◄¥u"ñç«
为什么会发生这种情况,我该如何解决?
您应该在 reverse
字符串中提供一个空终止符 [=13=]
以使用 printf
和 %s
格式正确打印您反转的字符串。
void reverseString(char* toReverse, char* reverse) {
int i = strlen(toReverse);
int counter = 0;
for (i; toReverse[counter] != '[=10=]'; i--) {
reverse[i] = toReverse[counter];
counter++;
}
reverse[counter] = '[=10=]'; //add this
}
此外,有时对于动态分配的东西,最好使用 malloc:
reverse = (char*)malloc(i + 1);
变成这样:
void reverseString(char* toReverse, char* reverse) {
int i = strlen(toReverse);
int counter = 0;
reverse = (char*)malloc(i + 1);
for (i; toReverse[counter] != '[=12=]'; i--) {
reverse[i] = toReverse[counter];
counter++;
}
reverse[counter] = '[=12=]'; //add this
}
您的字符串不是以 null 结尾的,这就是您在反转字符串后得到垃圾的原因。
因此,您应该首先在 reverseString
中执行 reverse[i+1]=0;
。
我会说 reverse[counter] = '[=11=]';
在它自己的函数中添加它。
看起来像
void reverseString(char* toReverse, char* reverse) {
int i = strlen(toReverse);
int counter = 0;
for (i; toReverse[counter] != '[=10=]'; i--)
{
reverse[i] = toReverse[counter];
counter++;
}
reverse[counter] = '[=10=]'; //add this
}
这有效!
您的代码有几个问题:
- 您在
main
中为 reversed
设置空终止符的方式不正确,因为您在 reverse
仍未初始化时使用 strlen(reverse)
。这是您获得垃圾输出的主要原因,因为空终止符未设置在正确的偏移量处,但这是未定义的行为,将未初始化的数组传递给 strlen
可能会产生更糟糕的后果。
- 为保持一致性和简单性,应在
reverseString
中设置空终止符。
- 你应该在复制字符之前递减
i
,否则你创建的反转字符串向右移动一位。
- 您应该用换行符结束
printf
格式字符串
main
应该 return 0
.
这是更正后的版本:
void reverseString(const char *toReverse, char *reverse) {
int i = strlen(toReverse);
int counter = 0;
reverse[i] = '[=10=]'; /* set the null terminator */
while (toReverse[counter] != '[=10=]') {
reverse[--i] = toReverse[counter++];
}
}
int main(int argc, char *argv[]) {
char reverse[strlen(argv[1]) + 1];
reverseString(argv[1], reverse);
printf("The reverse string is '%s'\n", reverse);
return 0;
}
我正在尝试在 C 中反转字符串,我能够完成此操作但并非没有我不太了解的副作用。这是我反转字符串的代码:
void reverseString(char *toReverse, char *reverse) {
int i = strlen(toReverse);
int counter = 0;
for (i; toReverse[counter] != '[=10=]'; i--) {
reverse[i] = toReverse[counter];
counter++;
}
}
int main(int argc, char *argv[]) {
char reverse[strlen(argv[1]) + 1];
reverse[strlen(reverse)] = '[=10=]';
reverseString(argv[1], reverse);
printf("The reverse string is '%s'", reverse);
}
当给出一个字符串时,这会正确地反转字符串,但也会添加一些额外的数据,例如:
给定字符串 abc123
返回字符串 321cbaub◄¥u"ñç«
为什么会发生这种情况,我该如何解决?
您应该在 reverse
字符串中提供一个空终止符 [=13=]
以使用 printf
和 %s
格式正确打印您反转的字符串。
void reverseString(char* toReverse, char* reverse) {
int i = strlen(toReverse);
int counter = 0;
for (i; toReverse[counter] != '[=10=]'; i--) {
reverse[i] = toReverse[counter];
counter++;
}
reverse[counter] = '[=10=]'; //add this
}
此外,有时对于动态分配的东西,最好使用 malloc:
reverse = (char*)malloc(i + 1);
变成这样:
void reverseString(char* toReverse, char* reverse) {
int i = strlen(toReverse);
int counter = 0;
reverse = (char*)malloc(i + 1);
for (i; toReverse[counter] != '[=12=]'; i--) {
reverse[i] = toReverse[counter];
counter++;
}
reverse[counter] = '[=12=]'; //add this
}
您的字符串不是以 null 结尾的,这就是您在反转字符串后得到垃圾的原因。
因此,您应该首先在 reverseString
中执行 reverse[i+1]=0;
。
我会说 reverse[counter] = '[=11=]';
在它自己的函数中添加它。
看起来像
void reverseString(char* toReverse, char* reverse) {
int i = strlen(toReverse);
int counter = 0;
for (i; toReverse[counter] != '[=10=]'; i--)
{
reverse[i] = toReverse[counter];
counter++;
}
reverse[counter] = '[=10=]'; //add this
}
这有效!
您的代码有几个问题:
- 您在
main
中为reversed
设置空终止符的方式不正确,因为您在reverse
仍未初始化时使用strlen(reverse)
。这是您获得垃圾输出的主要原因,因为空终止符未设置在正确的偏移量处,但这是未定义的行为,将未初始化的数组传递给strlen
可能会产生更糟糕的后果。 - 为保持一致性和简单性,应在
reverseString
中设置空终止符。 - 你应该在复制字符之前递减
i
,否则你创建的反转字符串向右移动一位。 - 您应该用换行符结束
printf
格式字符串 main
应该 return0
.
这是更正后的版本:
void reverseString(const char *toReverse, char *reverse) {
int i = strlen(toReverse);
int counter = 0;
reverse[i] = '[=10=]'; /* set the null terminator */
while (toReverse[counter] != '[=10=]') {
reverse[--i] = toReverse[counter++];
}
}
int main(int argc, char *argv[]) {
char reverse[strlen(argv[1]) + 1];
reverseString(argv[1], reverse);
printf("The reverse string is '%s'\n", reverse);
return 0;
}