使用指针反转字符串而不使用字符串处理函数?

时间:2016-04-09 07:10:00

标签: c arrays string pointers

我已根据评论更新了代码。因为我不在PC附近,你能检查一下并更新我吗?

#include<stdio.h>
int main()
{
    char s[100],rev[100],*ps1,*ps2,temp,*ptemp=&temp;
    int i,n=0;
    printf("Enter a string: ");
    scanf("%s",s);
    printf("The string is: %s\n",s);
    for(i=0;s[i]!='\0';i++)
    n++;
    ps1=&s[0];
    ps2=&s[n-1];
    for(i=0;i<n/2;i++)
    {
        *ptemp=*ps1;
        *ps1=*ps2;
        *ps2=*ptemp;
        *ps2--;
        *ps1++;
    }
    printf("The reverse of the string is: %s\n",s);
}

3 个答案:

答案 0 :(得分:1)

尝试让代码更接近您的代码并使其有效:

#include<stdio.h>

int main()
{
    char s1[100], rev[100], *ps1=s1, *prev=rev;
    int value1, value2 = 0;
    int *i = &value1, *length = &value2; // Why the hell do you need pointers? But if you do want them, use them the right way
    printf("Enter a string: ");
    scanf("%99s", s1); // parameter must be a 'char *', not a 'char **'
    printf("The string is: %s\n",s1); // Ends line with \n

    for(*i=0;*(ps1+(*i))!='\0';(*i)++)
    {
        (*length)++;
    }
    printf("The length is: %d\n", *length);

    for(*i=1;*(ps1+(*i)-1)!='\0';(*i)++)
    {
        *(prev+(*i)-1)=*(ps1+(*length)-(*i));
    }

    *(rev+(*i)-1)='\0';
    printf("\nThe reverse string is: %s\n",rev); // Ends line with \n
}

但我必须承认你的最后一个循环真的很难理解。另外,你为什么需要那些指针?

编辑:另外,您应该检查scanf()的返回值是1.因为如果不是,则表示scanf()没有将值设置为s1

编辑2:更正问题的新版本

#include<stdio.h>
int main()
{
    char s[100],*ps1,*ps2,temp,*ptemp=&temp; // removing unused rev
    int i,n=0;
    printf("Enter a string: ");
    scanf("%s",s);
    printf("The string is: %s\n",s);
    for(i=0;s[i]!='\0';i++)
    n++;
    ps1=&s[0]; // ps1 = s; would be fine
    ps2=&s[n-1]; // ps2 = s + (n-1); would be fine
    for(i=0;i<n/2;i++)
    {
        *ptemp=*ps1;
        *ps1=*ps2;
        *ps2=*ptemp;
        ps2--; // You want ps2 point to previous character
        ps1++; // You want ps1 point to next character
    }
    printf("The reverse of the string is: %s\n",s);
}

答案 1 :(得分:0)

我看到的第一个问题是scanf需要一个指针,但你给它一个指向内存地址的指针,它实际上是一个指向指针的指针:

scanf("%s", &s1);

应改为:

char s1[100] = {0};
scanf("%s", s1);

由于scanf没有检查内存溢出,因此在上面提到的语法中使用这种语法是更明智的选择

char s1[100] = {0};
scanf("%99s", s1);

这样,您就不会遇到任何缓冲区溢出问题

下一个问题是,在指针指向内存中的有效位置之前取消引用指针:

for(*i=0;*(ps1+(*i))!='\0';(*i)++)

更改为:

int i;
for(i = 0; ps1[i] != '\0'; i++)

为你的其他for循环做同样的事情

最后,删除此行:

*(rev+(*i)-1)='\0';

并将print语句更改为:

printf("\nThe reverse string is: %s",s1);

答案 2 :(得分:-3)

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


int
reverse (char *s)
{
  size_t l = strlen (s);
  char *lc, *rc, c;

  for (lc = s, rc = s + l - 1; lc < rc; lc++, rc--)
    {
      c = *lc;
      *lc = *rc;
      *rc = c;
    }
  return l;
}


int
main (int argc, char **argv)
{
  int n;

  for (n = 1; n < argc; n++)
    {
      printf ("%s -> ", argv[n]);
      reverse (argv[n]);
      printf ("%s\n", argv[n]);
    }

  return 0;
}

测试:

# ./reverse hello world
hello -> olleh
world -> dlrow

然后是Unicode; - )