使用scanf()进行动态分配

时间:2010-10-12 03:44:57

标签: c++ c visual-studio-2010

我的问题与此one完全相同。也就是说,我正在尝试使用scanf()来接收一个不确定长度的字符串,我希望scanf()为它动态分配内存。

然而,在我的情况下,我正在使用VS2010。据我所知,MS的scanf()在扫描字符串时没有a或m修饰符。有没有办法做到这一点(除了一次接收输入一个字符)?

5 个答案:

答案 0 :(得分:4)

scanf()的标准版本不会为其读入的任何变量分配内存。

如果您曾在某些版本的scanf()中使用非标准扩展程序蒙骗,那么您刚刚学习了如何编写可移植代码的第一课 - 请勿使用非标准扩展。你可以说“不要使用你感兴趣的所有平台上都没有的扩展”,但要意识到这套平台可能会随着时间而改变。

答案 1 :(得分:2)

你绝对必须使用scanf吗? std::string s; std::cin >> s;getline( std::cin, s );不适合您吗?

答案 2 :(得分:1)

如果你想使用scanf,你可以只分配一个足够大的缓冲区来保存任何可能的值,比如1024字节,然后使用1024的最大字段宽度说明符。

ma是特定的非标准GNU扩展,因此微软编译器不支持它们。人们可能希望视觉工作室能够做到。

以下是使用scanf读取设置的示例,只需将其打印出来即可:

#include <stdio.h>
#include <errno.h>
#include <malloc.h>

int
main( int argc, char **argv )
{   // usage ./a.out < settings.conf

    char *varname;
    int value, r, run = 1;

    varname = malloc( 1024 );

    // clear errno
    errno = 0;

    while( run )
    {   // match any number of "variable = #number" and do some "processing"

        // the 1024 here is the maximum field width specifier.
        r = scanf ( "%1024s = %d", varname, &value );
        if( r == 2 )
        {   // matched both string and number
            printf( " Variable %s is set to %d \n", varname, value );
        } else {
            // it did not, either there was an error in which case errno was
            // set or we are out of variables to match
            if( errno != 0 )
            {   // an error has ocurred.
                perror("scanf");
            }
            run = 0;
        }
    }

    return 0;
}

以下是settings.conf

的示例
cake = 5
three = 3
answertolifeuniverseandeverything = 42
charcoal = -12

您可以阅读有关scanf on the manpages的更多信息。

你当然可以使用getline(),然后在字符之后解析字符。

如果你想进一步了解你想要达到的目标,你可能会得到更好的答案。

答案 3 :(得分:0)

我认为,在现实世界中,需要对用户输入的长度有一些最大限制。

然后你可以用getline()之类的内容阅读整行。见http://www.cplusplus.com/reference/iostream/istream/getline/

请注意,如果您想要来自用户的多个输入,则不需要为每个输入分别设置char个数组。你可以有一个大缓冲区,例如char buffer[2048],用于与getline()一起使用,并将内容复制到适当分配(和命名)的变量,例如像char * name = strdup( buffer )这样的东西。

答案 4 :(得分:0)

请勿使用scanf来读取字符串。它可能甚至没有你认为它做的事情; %s只读到下一个空格。