#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;
}
当我编译该程序时,发生分段错误。
谁能告诉我,这段代码是什么问题?
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::string
与std::cin
而不是scanf
一起使用。
std::string s;
std::cin >> s;
[如果必须使用C工具,则scanf("%s", s);
不是最安全的方法,如果您不传递char array
容器的大小,将说明符%s
更改为%100s
或将其完全更改为更安全的方法像fgets(s, sizeof(s), stdin);
这样的功能是更好的选择。
char *s;
您创建了一个指针,尽管它没有指向任何东西(未初始化)。
scanf("%s",s);
您尝试将数据读入s
指向的字符串中,但不存在这种东西。
💥!
分配一些内存并使其指向s
...,或者,最好使用std::string
和std::cin
。
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!