【问题标题】:Character Array of dynamic length动态长度的字符数组
【发布时间】:2017-08-27 08:17:01
【问题描述】:

我编写了一个 C++ 函数,可以表示如下: 它所做的只是获取一个字符串(这是它崩溃的地方)并将其反转。

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
 cout<<"Enter a string: "<<endl;
 char *str;
 gets(str);
 cout<<"Reversed String is: ";
 for(int i=strlen(str)-1;i>=0;i--)
    cout<<(str[i]);
 return 0;
}

我猜有某种内存访问冲突。

任何线索为什么这不起作用?

错误:分段错误(核心转储)

【问题讨论】:

  • char *str; - 你从不为字符串分配内存 -> 你调用 未定义的行为。如果您使用 C++ 编写,只需使用 std::string 而不是 C 样式的 char 数组。 (另外,std::gets 在 C++ 中已被弃用,并在 C++14 中被删除)
  • C++ 和 C 不是同一种语言。选择其中一个,然后尝试解决您的任务。
  • 我删除了 C 标记,因为这显然是 C++

标签: c++ pointers nullpointerexception char


【解决方案1】:

中,通过std::reversealgorithm 可以更轻松、更不容易出错地解决此问题。也更容易使用std::string

#include <iostream>
#include <algorithm>

int main ()
{
  std::string input;
  std::cout << "Enter string to reverse: ";
  std::cin >> input;
  std::reverse(input.begin(),input.end());
  std::cout << "Reversed string: " << input << std::endl;
  return 0;
}

如果你必须通过 char 数组来做,试试这个(你甚至不需要动态内存分配)

#include <iostream>
#include <algorithm>
#include <cstring>

int main ()
{
  char input[1024];
  puts("Enter string to reverse: ");
  fgets(input, 1024, stdin);
  std::reverse(input, input + strlen(input));
  printf("Reversed string: %s", input);
  return 0;
}

【讨论】:

    【解决方案2】:

    您的代码不是 c++ 风格,我建议您看看 Filip (https://stackoverflow.com/a/45903067/4386427) 的答案

    我将解决您的代码出了什么问题。

    当你这样做时

    char* str;
    

    你得到的只是一个可以指向char的指针。你不会因为持有char 而获得任何记忆。此外,指针变量str 的值未初始化。

    所以当你这样做时

    strlen(str)
    

    您读取了一个未初始化的变量并尝试将此未初始化的值视为 C 风格的字符串。这是未定义的行为,很可能导致程序崩溃。

    您需要确保str 在使用前已初始化。如果你想要动态内存,你可以这样做:

    char *str;
    str = new(char[100]);  // Initialize str to point to a dynamic allocated
                           // char array with size 100
    ...
    ...
    delete(str);
    

    但同样——我不会在 c++ 代码中使用这种风格

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 2019-06-15
      相关资源
      最近更新 更多