尝试从输入中获取字符串时出现段错误

问题描述 投票:0回答:3
#include <iostream>

using namespace std;

int main() {
  char *s;

  printf("enter a word \n");

  scanf("%s", s);

  int i;

  for (i = 0; s[i] != '\0'; i++) {
  }

  printf("length is = %d", i);

  return 0;
}

当我编译该程序时,发生分段错误。

谁能告诉我,这段代码是什么问题?

c++ string input segmentation-fault scanf
3个回答
1
投票
char *s;

已统一化,直到将输入流分配给它为止。

char s[100]; //space for 99 characters plus null terminator

char* s = malloc(100); //each char has the size of one byte

这些是用于C ++的C工具,但是,您可以/应该将std::stringstd::cin而不是scanf一起使用。

std::string s;
std::cin >> s;

[如果必须使用C工具,则scanf("%s", s);不是最安全的方法,如果您不传递char array容器的大小,将说明符%s更改为%100s或将其完全更改为更安全的方法像fgets(s, sizeof(s), stdin);这样的功能是更好的选择。


1
投票
char *s;

您创建了一个指针,尽管它没有指向任何东西(未初始化)。

scanf("%s",s);

您尝试将数据读入s指向的字符串中,但不存在这种东西。

💥!

分配一些内存并使其指向s ...,或者,最好使用std::stringstd::cin


1
投票
char *s;

printf("enter a word \n");

scanf("%s",s);

scanf%s不分配内存,而是读入您为其提供的缓冲区(例如s = malloc(100);。该缓冲区需要多大才能避免缓冲区溢出?)不幸的是,它可能要很长时间才能空格字符,因此本质上是不安全的。

您可以指定一个最大的开头(不包括空终止符!),但是要处理可变大小,您需要动态地构建复杂的格式字符串。如果用户输入的字符串太长,该怎么办。

char s[100];
scanf("%99s", s);

由于标记了C ++,因此可以使用std::string和IO流(例如,用于控制台输入的std::cin)将为您处理所有内存分配。

std::string s;
std::cout << "enter a word" << std::endl;
std::cin >> s;

对于C,您可以使用fgets(str, num, stream),这使您可以指定最大长度并以一种简单的方式避免溢出。

char s[128];
fgetsf(s, 100, stdin);

或者使用POSIX 2008 scanf可以分配内存,但是我不认为这是普遍支持的,例如由Microsoft Visual Studio提供。

char *s = 0;
scanf("%ms", &s); // pass a pointer to a pointer!
free(s); // needs to be freed later!
© www.soinside.com 2019 - 2024. All rights reserved.