C++ С;“错误”;s1、s2在此函数中未初始化使用;

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

这是我在第一课编程基础课之后遇到的问题之一

gets()工作得有点正常(我认为),但“cin”拒绝工作

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% того, что ты написал. Код, приложенный мн