我想反转一个字符串,所以我写了以下内容:
#include<stdio.h>
#include<conio.h>
#include<string.h>
char *inverseString(char *s);
char *inverseString(char *s)
{
char *s1;
int i = 0;
s1 = (char*)malloc (strlen(s)+1);
int j= strlen(s)-1;
for (; j>=0; j--) // dont know why for(; j> 0; j--) not work
{
s1[j] = s[i];
i++;
}
return s1;
}
void main(void)
{
char string[30];
printf("string: ");
gets(string);
printf("inverse string is : %s",inverseString(string));
getch();
}
但结果最后有一个怪异的角色。
我该如何解决?
由于
答案 0 :(得分:3)
您必须在s1
:
s1[strlen(s)] = 0;
此外,不是多次执行“昂贵的”strlen(s)
,而是应该通过将其放入变量来计算一次长度,然后您应该使用变量而不是strlen(s)
调用:< / p>
size_t len = strlen(s);
通过调用free()
函数调用打印字符串内容后,应释放已分配的内存块。
在这种情况下,您不必转发声明inverseString()
并且更加勇敢并使用更大的缓冲区大小,而不是使用更常见的值,例如0x100。
答案 1 :(得分:1)
字符串必须以'\ 0'终止。这是标志着字符串结束的原因。 空字符通常表示为源代码字符串文字或字符常量中的转义序列\。
这是更优雅的地方逆转:
void strrev(char *p)
{
char *q = p;
while(q && *q) ++q;
for(--q; p < q; ++p, --q)
*p = *p ^ *q,
*q = *p ^ *q,
*p = *p ^ *q;
}
int main(int argc, char **argv)
{
do {
printf("%s ", argv[argc-1]); strrev(argv[argc-1]);
printf("%s\n", argv[argc-1]);
} while(--argc);
return 0;
}
答案 2 :(得分:0)
您应该使用NUL
字符\0
来终止字符串。
char *inverseString(char *s)
{
...
...
s1[++i] = '\0';
return s1;
}
注意:请勿使用gets
来读取字符串(现在已将其从标准中删除),而您可以使用fgets
。
fgets(string, 30, stdin);
答案 3 :(得分:0)
首先,这是一个字符串反转主题,其中描述了一个非常酷的方法:Reversing a string in C。
然后,我建议不要使用gets()
因为它might be dangerous(gets()
实际上是您发生错误的原因!)。
最后,这是代码,它可能适合您:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/* No prototype for inverseString is required here, since the routine call occurs
after its implementation */
char *inverseString(char *s)
{
char * s1;
int i, j;
s1 = (char *)malloc(strlen(s)+1);
i = 0;
for (i = 0, j = strlen(s) - 1; j>=0; i++, j--)
{
s1[i] = s[j];
}
return s1;
}
void main(void)
{
char string[30];
printf("string: ");
scanf("%[^\n]", &string);
printf("inverse string is : %s", inverseString(string));
getch();
}
这是good answer,我从{。}构建了scanf("%[^\n]", &string)
。{/ p>