在C中反转字符串时出现奇怪的字符

时间:2014-03-05 16:00:07

标签: c string character

我想反转一个字符串,所以我写了以下内容:

#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();
}

但结果最后有一个怪异的角色。

我该如何解决?

由于

4 个答案:

答案 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 dangerousgets()实际上是您发生错误的原因!)。

最后,这是代码,它可能适合您:

#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>