繁体   English   中英

使用 scanf 读取字符串时程序崩溃

[英]Program crashes when using scanf to read strings

我的程序总是在类函数中的第 5 个 scanf 之后崩溃。

class PersoenlicheDaten{
    public:
        void eingabe(){
            printf("Bitte geben sie jetzt ihre Persoenlichen Daten ein: \n\n");
            printf("Vorname: ");
            scanf("%s", &vorname);
            printf("Nachname: ");
            scanf("%s", &nachname);
            printf("Alter: ");
            scanf("%d", &alter);
            printf("Geburtsdatum: ");
            scanf("%s", &geburtsdatum);
            printf("Addresse: ");
            scanf("%s", &addresse);
        }
    private:
        std::string vorname;
        std::string nachname;
        int alter;
        std::string geburtsdatum;
        std::string addresse;
};

内部main

do{
    pd.eingabe();
    printf("Sind sie mit der eingabe zufrieden?\n\n");
    printf("Antwort(j/n): ");
    scanf("%c", &v.antwiederholen);
    if(v.antwiederholen == 'j'){
        v.running = true;
    }else{
        v.running = false;
    }
}while(v.running);

为什么会这样,因为它通常应该可以工作。 我也想使用 scanf 而不是 std::cin 来学习不同的输入方法。

这里的问题是你不能使用scanf来读取std::string 您必须将std::string转换为char * ,或使用cin 您可以做的另一件事是首先从 scanf 读取到临时char * ,然后通过执行以下操作将其转换为std::string

scanf("%s", &someCharPointer);
std::string s = someCharPointer;

作为评论,尝试学习如何使用不同的东西并没有错。 scanfcin各有优缺点。

要使用 scanf 读取字符串,您实际上必须有足够大的缓冲区来读取字符串。

char temp[100];
std::string vorname;
if(scanf("%99s", temp) ==1){
    vorname = temp;
}

使用 scanf,您必须限制要读取的字符数以匹配您的临时缓冲区,并在使用缓冲区读取之前检查返回值。 当使用 getline 或 operator>> 从 istream 直接读取到 std::string 时 - 您的字符串变量将增长以匹配用户输入

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM