如何解决指针字符串未返回预期输出
#include <stdio.h>
void revstr(char str[])
{
char temp;
int size = 0;
while(*str != '\0'){
size++;
str++;
}
for (int i = 0; i < size/2; i++)
{
temp = str[i];
str[i] = str[size-1-i];
str[size-1-i] = temp;
}
for(int i = 0; i < size; i++)
{
printf("%c\n",*(str+i));
}
}
int main()
{
char str[20];
printf("enter a string: \n");
scanf("%s",&str);
revstr(str);
return 0;
}
为什么我的 rev 字符串不打印它正在打印出一些垃圾值的字符串的反向。 你能指出原因吗?
解决方法
在这个while循环之后
while(*str != '\0'){
size++;
str++;
}
指针 str 未指向字符串的开头。
相反,您可以编写例如
while( str[size] != '\0'){
size++;
}
尽管如此,这样的函数应该只做一件事:反转字符串。由函数的调用者决定是否输出反转的字符串。
所以函数看起来像
char * revstr( char s[] )
{
size_t n = 0;
while ( s[n] ) ++n;
for ( size_t i = 0; i < n / 2; i++ )
{
char c = s[i];
s[i] = s[n - i - 1];
s[n - i - 1] = c;
}
return s;
}
主要你可以写
puts( revstr( str ) );
这是一个演示程序。
#include <stdio.h>
char * revstr( char s[] )
{
size_t n = 0;
while ( s[n] ) ++n;
for ( size_t i = 0; i < n / 2; i++ )
{
char c = s[i];
s[i] = s[n - i - 1];
s[n - i - 1] = c;
}
return s;
}
int main(void)
{
char s[] = "Hello";
puts( s );
puts( revstr( s ) );
return 0;
}
程序输出为
Hello
olleH
当然,您可以使用标准字符串函数 strlen
代替 while 循环。
size_t n = strlen( s );
注意scanf
的调用
scanf("%s",&str);
第二个参数应该是表达式 str
scanf("%s",str);
,
我会以另一种方式实现它:
char *reverse(char *str)
{
char *wrk = str,*end = str;
if(str && *str)
{
while(*(end + 1)) end++;
while(end > wrk)
{
char tmp = *end;
*end-- = *wrk;
*wrk++ = tmp;
}
}
return str;
}
- 最好检查一下参数是否正确。
- 我会返回值。它允许您在表达式中使用反转字符串并将其用作函数参数。下面的例子:
int main(void)
{
char s[] = "Hello world";
printf("%s\n",reverse(s));
}
https://godbolt.org/z/fbo4nsn38
,在您的代码中,您将指针 str 推进以计算其长度,但之后您忘记将其重置为开始。此外,您对 scanf 的调用应该传递 str,而不是它的地址。此外,如果用户输入超过 19 个字符的字符串,scanf 将写入超出 str 的末尾。试试这个:
#include <stdio.h>
#include <string.h>
void revstr(char str[])
{
char temp;
int size = strlen(str);
for (int i = 0; i < size / 2; i++) {
temp = str[i];
str[i] = str[size - 1 - i];
str[size - 1 - i] = temp;
}
}
int main()
{
char str[20];
printf("enter a string: \n");
fgets(str,sizeof(str),stdin);
str[strcspn(str,"\n")] = '\0';
revstr(str);
printf("%s\n",str);
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。