【问题标题】:Reverse a string of any length using pointers in C [duplicate]使用C中的指针反转任意长度的字符串[重复]
【发布时间】:2013-04-12 11:40:34
【问题描述】:

我刚刚浏览了一些面试问题,发现这段代码使用指针反转字符串。但我看到他们在这里定义了限制字符串长度的 char string[100] 。我不太擅长 C。如何修改它以使其成为任意长度的字符串?

#include<stdio.h>

int string_length(char*);
void reverse(char*);

main() 
{
   char string[100];

   printf("Enter a string\n");
   gets(string);

   reverse(string);

   printf("Reverse of entered string is \"%s\".\n", string);

   return 0;
}

void reverse(char *string) 
{
   int length, c;
   char *begin, *end, temp;

   length = string_length(string);

   begin = string;
   end = string;

   for ( c = 0 ; c < ( length - 1 ) ; c++ )
      end++;

   for ( c = 0 ; c < length/2 ; c++ ) 
   {        
      temp = *end;
      *end = *begin;
      *begin = temp;

      begin++;
      end--;
   }
}

int string_length(char *pointer)
{
   int c = 0;

   while( *(pointer+c) != '\0' )
      c++;

   return c;
}

【问题讨论】:

  • 这可能有帮助吗:stackoverflow.com/questions/2505451/…
  • 您可以将lengthstring_length 的结果)用于end
  • 这不是一个“反向字符串”问题,因为这部分很好,它正在读取字符串问题。
  • 不要使用gets();它不在 C2011 中,无法安全使用。使用fgets() 或POSIX getline()

标签: c string reverse


【解决方案1】:

使用动态内存分配代替静态数组:char *tab = malloc(n * sizeof(char)) 其中n 是一些代表所需长度的变量。

【讨论】:

  • 这并不容易。这仍然会限制可以读取的字符数量。内存只是放在其他地方(在堆而不是堆栈上)。
  • 但它肯定会突破极限。最终的解决方案是从文件中读取输入并将输出写入文件,但我怀疑这是理想的解决方案。
  • @BartFriederichs 您能否解释一下它仍然会如何限制可以读取的字符数量?不能随意吗?
  • @BartFriederichs 你的意思是受限于可用的总内存吧?
  • @SheerFish yes n 可以是任意的,但它仍然是一个限制。问题需要 any 大小。我认为这是受硬件而非软件的限制。
【解决方案2】:

如果您希望用户在运行时决定/输入大小,您可以为此使用 malloc()。

malloc()

【讨论】:

    【解决方案3】:

    动态内存分配是解决方案.. 获取指向字符串的指针并动态分配内存..这在运行时分配.. 这将解决您的问题..

    char *str;
    str = (char*)malloc(n *sizeof(char));
    

    注意:类型转换在 C 中是可选的,这里的“n”是所需的长度。(可以是用户输入)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      相关资源
      最近更新 更多