C++ С;“错误”;s1、s2在此函数中未初始化使用;
这是我在第一课编程基础课之后遇到的问题之一 gets()工作得有点正常(我认为),但“cin”拒绝工作C++ С;“错误”;s1、s2在此函数中未初始化使用;,c++,string,fgets,getline,c-strings,C++,String,Fgets,Getline,C Strings,这是我在第一课编程基础课之后遇到的问题之一 gets()工作得有点正常(我认为),但“cin”拒绝工作 int main(无效) { 字符*s1,*s2; puts(“为gets()输入您的姓名”); 获取(s1); puts(“为cin()输入您的姓名”); cin>>s2; 不能这些指针 char *s1, *s2; 自动存储的持续时间未初始化,并且具有不确定的值。因此,程序具有未定义的行为 改为使用字符数组或类型为std::string的对象 考虑到C标准不支持函数gets。请使用fge
int main(无效)
{
字符*s1,*s2;
puts(“为gets()输入您的姓名”);
获取(s1);
puts(“为cin()输入您的姓名”);
cin>>s2;
不能这些指针
char *s1, *s2;
自动存储的持续时间未初始化,并且具有不确定的值。因此,程序具有未定义的行为
改为使用字符数组或类型为std::string
的对象
考虑到C标准不支持函数gets
。请使用fgets
而不是gets
或者这是一个C++程序,然后使用<代码> STD::GETLION<代码>或成员函数<代码> STD::CIN。GETLION<代码> < <
int main(void)
{
std::string s1;
std::string s2;
puts("Enter your name and surname");
std::getline(std::cin, s1);
puts("Enter your name and surname again");
std::getline(std::cin, s2);
// Use s1 and s2.
return 0;
}
注意这句话
cin >> s2;
不允许输入几个用空格分隔的单词
这是一个演示程序
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
int main()
{
const size_t N = 100;
char s1[N];
std::string s2;
std::ios_base::sync_with_stdio();
std::printf( "Enter your name and surname for fgets(): " );
std::fgets( s1, sizeof( s1 ), stdin );
s1[std::strcspn( s1, "\n" )] = '\0';
std::printf( "Enter your name and surname for std::cin: " );
std::getline( std::cin, s2 );
std::cout << s1 << "! Hello from fgets" << std::endl;
std::cout << s2 << "! Hello from std::cin" << std::endl;
return 0;
}
这些指针
char *s1, *s2;
自动存储的持续时间未初始化,并且具有不确定的值。因此,程序具有未定义的行为
改为使用字符数组或类型为std::string
的对象
考虑到C标准不支持函数gets
。请使用fgets
而不是gets
或者这是一个C++程序,然后使用<代码> STD::GETLION<代码>或成员函数<代码> STD::CIN。GETLION<代码> < <
int main(void)
{
std::string s1;
std::string s2;
puts("Enter your name and surname");
std::getline(std::cin, s1);
puts("Enter your name and surname again");
std::getline(std::cin, s2);
// Use s1 and s2.
return 0;
}
注意这句话
cin >> s2;
不允许输入几个用空格分隔的单词
这是一个演示程序
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
int main()
{
const size_t N = 100;
char s1[N];
std::string s2;
std::ios_base::sync_with_stdio();
std::printf( "Enter your name and surname for fgets(): " );
std::fgets( s1, sizeof( s1 ), stdin );
s1[std::strcspn( s1, "\n" )] = '\0';
std::printf( "Enter your name and surname for std::cin: " );
std::getline( std::cin, s2 );
std::cout << s1 << "! Hello from fgets" << std::endl;
std::cout << s2 << "! Hello from std::cin" << std::endl;
return 0;
}
您的程序具有未定义的行为
get
需要一个指向足够有效内存的参数来读取和存储输入。在发布的代码中,s1
不满足该要求。使用cin
和s2
也存在类似问题
更重要的是,不要再使用gets
。由于安全问题,这是一个不推荐使用的函数。请使用std::string
和std::getline
int main(void)
{
std::string s1;
std::string s2;
puts("Enter your name and surname");
std::getline(std::cin, s1);
puts("Enter your name and surname again");
std::getline(std::cin, s2);
// Use s1 and s2.
return 0;
}
有用阅读:您的程序具有未定义的行为
get
需要一个指向足够有效内存的参数来读取和存储输入。在发布的代码中,s1
不满足该要求。使用cin
和s2
也存在类似问题
更重要的是,不要再使用gets
。由于安全问题,这是一个不推荐使用的函数。请使用std::string
和std::getline
int main(void)
{
std::string s1;
std::string s2;
puts("Enter your name and surname");
std::getline(std::cin, s1);
puts("Enter your name and surname again");
std::getline(std::cin, s2);
// Use s1 and s2.
return 0;
}
有用阅读:此外,请记住,声明/创建指针变量不会自动创建指向对象。您必须始终明确地这样做
char* s = new char[ N ];
…无论N
的值是多少。请不要忘记在您希望使用内存后的某个时间释放内存
delete [] s;
这是因为,您使用C++时,通常避免直接处理指针,如果必须使用“代码> STD::UnQuyGPPTR <代码>或<代码> STD::SyrdYPPTR < /C> < /P> > P>另外,请记住,声明/创建指针变量不会自动创建指向对象。必须始终明确地执行该操作。
char* s = new char[ N ];
…无论N
的值是多少。请不要忘记在您希望使用内存后的某个时间释放内存
delete [] s;
<> P>这是因为你使用C++,通常你可以避免直接处理指针,如果你必须使用一个<代码> STD::UnjyJPPT/<代码>或:“代码> STD::SyddypTr< /Calp>不使用<代码>获取< /代码>。它被弃用,并且从C和C++ +C++中移除了。你在标题中使用C,但是用C++标记了你的问题。不一样,正确答案也不一样。我认为你需要一个新的老师。不要使用<代码>获取< /C>。它被弃用,并且已经从C和C++ +C++中移除了。你在标题中使用了C,但是用C++标记了你的问题。它们不一样,答案也正确。不同的会是不同的。我认为你需要一个新老师。我想你需要一个新老师。我想你需要一个新老师。我想你需要一个新老师。我想你需要一个新老师。我想你需要一个新老师。我想你需要一个新老师。我想你需要一个新老师。我,我的,我想,我的,我的,我的,我的,我的,我的,我的,我的,我想,不同的,不同的,不同的,会会不同的。不同。不同。不同。不同。我会会不同。我想你会不同。我想你需要不同。我想你需要一不同。我想你需要一个新老师。我。我想你需要一个新老师。我。我想你需要一个新老师。我。我想你需要。我的老师。我。我想你需要一个新老师。我想你需要一个新老师。我的教师。我。我想你需要。我想你需要一个新教师П大一新生培训手册中的代码是不正确的。正如我已经写过的,这个函数不是一个标准函数。其次,这个函数不是一个标准函数n>>s2;不允许您在一行中读取多个单词,因为它最多可以读取第一个空格字符。请记住,有一个俄语网站ru.stackoverflow.com。虽然可以作为一个示例,但请确保不要在实际程序中混合使用stdio和iostream,并且更喜欢使用iostream库,因为它可以读入
std::string
更安全。@freshman我认为程序中最困难的部分是语句s1[std::strcspn(s1,“\n”)]='\0';。问题在于函数fgets可以将新行字符附加到读取的字符串中。此语句允许从字符串中排除此字符。函数strcspn找到新行字符的位置,然后将其替换为终止的零字符'\0';СПаббббчб,Сббббббббокурсникам, пускай посмотрят, но мы на первом курсе и это было наше первое занятие по программированию, и я не понял 50% того, что ты написал. Код, приложенный мн