在 C 中使用指针反转数组
Reverse array with using pointers in C
#include <stdio .h>
#include <stdlib .h>
int main(){
char text1 [N] ;
char reverse [N] ;
char* txtptr = text1 ;
char* revtxtptr = reverse ;
int N;
printf (”\n Enter any text here : ”) ;
scanf(”%s”, text1);
while(N> 0){
txtptr --;
*revtxtptr = *txtptr ;
revtxtptr++;
}
*revtxtptr = ’[=10=]’;
printf (”The reverse text is : %s \n” , reverse) ;
return 0;
}
我想在这里看到输出输入的反向形式。
就像是
输入:
CLEARLY
输出:
YLRAELC
你能帮我改正我的错误吗?
您的“交换两个字节”的逻辑是……简单……错误。这对您有什么启发吗?
char temp;
temp = *chartxtptr;
*chartxtptr = *txtptr;
*txtptr = temp;
如果不使用临时文件来保存即将被替换的字节,则不能“交换”任何两个字节。
这里有一个 int 数组的示例函数。
int *reverseINTarray(int *array, size_t size)
{
int *end, *wrk = array;
if(array && size > 1)
{
end = array + size - 1;
while(end > wrk)
{
int tmp = *wrk;
*wrk++ = *end;
*end-- = tmp;
}
}
return array;
}
或
int *reverseINTarray(const int *src, int *dest, size_t size)
{
int *wrk = dest;
if(src && dest && size)
{
wrk += size - 1;
while(size--)
{
*wrk-- = *src++;
}
}
return dest;
}
以下是对您的代码的更正:
#include
行中 .h>
前有空格。
- 您应该限制缓冲区的大小。
- N 未初始化。
- N 没有递减。
txtptr
没有放在 C 字符串的末尾,而是在 while
循环中递减。
scanf
不限于缓冲区大小减1。
- 您需要使用
strlen
查找字符串的大小,或者遍历字符串直到找到“\0”。 (改为前进方向)
- 您使用了错误的双引号和单引号(“智能”引号)
这是一个安全代码,可以反转输入数组(不是就地):
#include <stdio.h>
#include <stdlib.h>
#define MAXSTR 255
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
int main() {
char text1[MAXSTR + 1];
char revbuf[MAXSTR + 1];
char* txtptr = text1;
char* reverse = revbuf + MAXSTR;
printf("\nEnter any text here : ");
scanf("%" STR(MAXSTR) "s", text1);
*reverse = '[=10=]';
while(*txtptr) {
*--reverse = *txtptr++;
}
printf ("The reverse text is : %s \n" , reverse) ;
return 0;
}
#include <stdio .h>
#include <stdlib .h>
int main(){
char text1 [N] ;
char reverse [N] ;
char* txtptr = text1 ;
char* revtxtptr = reverse ;
int N;
printf (”\n Enter any text here : ”) ;
scanf(”%s”, text1);
while(N> 0){
txtptr --;
*revtxtptr = *txtptr ;
revtxtptr++;
}
*revtxtptr = ’[=10=]’;
printf (”The reverse text is : %s \n” , reverse) ;
return 0;
}
我想在这里看到输出输入的反向形式。 就像是 输入:
CLEARLY
输出:
YLRAELC
你能帮我改正我的错误吗?
您的“交换两个字节”的逻辑是……简单……错误。这对您有什么启发吗?
char temp;
temp = *chartxtptr;
*chartxtptr = *txtptr;
*txtptr = temp;
如果不使用临时文件来保存即将被替换的字节,则不能“交换”任何两个字节。
这里有一个 int 数组的示例函数。
int *reverseINTarray(int *array, size_t size)
{
int *end, *wrk = array;
if(array && size > 1)
{
end = array + size - 1;
while(end > wrk)
{
int tmp = *wrk;
*wrk++ = *end;
*end-- = tmp;
}
}
return array;
}
或
int *reverseINTarray(const int *src, int *dest, size_t size)
{
int *wrk = dest;
if(src && dest && size)
{
wrk += size - 1;
while(size--)
{
*wrk-- = *src++;
}
}
return dest;
}
以下是对您的代码的更正:
#include
行中.h>
前有空格。- 您应该限制缓冲区的大小。
- N 未初始化。
- N 没有递减。
txtptr
没有放在 C 字符串的末尾,而是在while
循环中递减。scanf
不限于缓冲区大小减1。- 您需要使用
strlen
查找字符串的大小,或者遍历字符串直到找到“\0”。 (改为前进方向) - 您使用了错误的双引号和单引号(“智能”引号)
这是一个安全代码,可以反转输入数组(不是就地):
#include <stdio.h>
#include <stdlib.h>
#define MAXSTR 255
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
int main() {
char text1[MAXSTR + 1];
char revbuf[MAXSTR + 1];
char* txtptr = text1;
char* reverse = revbuf + MAXSTR;
printf("\nEnter any text here : ");
scanf("%" STR(MAXSTR) "s", text1);
*reverse = '[=10=]';
while(*txtptr) {
*--reverse = *txtptr++;
}
printf ("The reverse text is : %s \n" , reverse) ;
return 0;
}