【问题标题】:Weird character appears when Inversing string in C在C中反转字符串时出现奇怪的字符
【发布时间】:2014-03-05 16:00:06
【问题描述】:

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

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

但结果最后有一个奇怪的字符。

我该如何解决?

谢谢

【问题讨论】:

  • 请永远不要使用gets(),即使在玩具程序中也不行。它不再在标准 C 中,因为它不能安全地使用——也就是说,如果程序使用gets(),它就无法保护自己免受恶意攻击。使用fgets() 并记住删除换行符。

标签: c string character


【解决方案1】:

您必须在s1 的末尾添加一个终止零字符:

s1[strlen(s)] = 0;

此外,与其多次执行“昂贵的”strlen(s),不如通过将其放入变量中来计算一次长度,然后您应该使用该变量而不是strlen(s) 调用:

size_t len = strlen(s);

您应该在打印其字符串内容后通过调用free() 函数调用来释放分配的内存块。

在这种情况下,您不必转发声明 inverseString() 并更勇敢地使用更大的缓冲区大小,而不是 30 让我们使用更常见的值,例如 0x100。

【讨论】:

    【解决方案2】:

    字符串必须以 '\0' 结尾。这就是字符串结束的标志。 在源代码字符串文字或字符常量中,空字符通常表示为转义序列 \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;
    }
    

    【讨论】:

      【解决方案3】:

      首先,这是一个字符串反转主题,其中描述了一个非常酷的方法: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]", &amp;string) 的构造。

      【讨论】:

        【解决方案4】:

        您应该使用NUL 字符\0 终止您的字符串。

        char *inverseString(char *s)
        {   
            ...
            ...
        
            s1[++i] = '\0';  
            return s1;
        
        }   
        

        注意:不要使用gets 来读取字符串(它现在已从标准中删除),您可以使用fgets

        fgets(string, 30, stdin);  
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-19
          • 2021-12-13
          • 1970-01-01
          • 2012-08-15
          • 2011-01-16
          • 2014-08-28
          • 2021-04-23
          • 1970-01-01
          相关资源
          最近更新 更多