我已根据评论更新了代码。因为我不在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);
}
答案 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; - )