【问题标题】:using printf and then scanf in loop在循环中使用 printf 然后 scanf
【发布时间】:2016-07-30 11:13:11
【问题描述】:
char *str;
while(1)
{
    printf("$$$$>");
    scanf("%s",str);
}

在这段代码中,我只想打印一个命令提示符。当用户输入某些内容时,什么也没有发生,命令提示符会再次打印。但是 scanf() 运行一次,然后 $$$$> 循环打印。 当我尝试使用字符数组而不是 str 指针时,代码运行。 为什么?

【问题讨论】:

    标签: c printf scanf


    【解决方案1】:

    字符 *str;

    您使用了str,但未对其进行初始化。在另一个函数(如scanf)中使用未初始化的指针会导致程序崩溃。

    你可以通过malloc(动态分配)str指针来解决这个问题,但是对于这种简单的用法,你可以使用数组来代替。

    char str[100] = "";
    while(1)
    {
        printf("$$$$>");
        // scanf("%s",str);  // not recommended
        fgets( str, sizeof( str ), stdin );  // fgets is better
    }
    

    【讨论】:

    • @chux 同意,已更改
    • 感谢回答。但我还有 1 个疑问。 b/w char str[100]=""; 有什么区别?和 char str[100];两者都给出相同的输出]
    • @RavindraKoranga str[100]=""; 确保在任何操作之前将字符串初始化为空(即所有字符都设置为 0)。在使用之前初始化变量是一种很好的做法。
    • 字符 *str; str=(char *)malloc(sizeof(char)*100); fgets(str,sizeof(str),stdin); printf("%s",str);当我运行这段代码时,即使我输入很大,也只打印 7 个字符。你能告诉我原因吗?
    • 那是因为你使用str作为指针; sizeof( str ) 在您的机器中只有 8 个字符,因此您只能输入 7 个字符。当我将str 声明为数组时,sizeof( str ) 将起作用。如果你坚持使用指针,那么你必须自己提供 100 而不是使用sizeof
    【解决方案2】:

    因为您没有分配 str 可以指向的内存缓冲区,所以在 str decleration 下方添加这一行:

    str=malloc(sizeof(char)*1000);
    

    【讨论】:

    • sizeof(char) 始终为 1,因此不会为代码增加价值。如果要匹配str的类型,只需使用str=malloc(sizeof * str * 1000);
    • 你错了...... char 的大小确实是 1,这是为了代码可读性...... str 是一个地址,所以你只分配了 1000* 地址值,可以是数百万字节。 ..而且你不需要“匹配”任何类型......你显然不知道 c..
    • 嗯“显然不知道 c” --> 见 badge 和“str 是一个地址,所以你刚刚分配了 1000* 地址值” --> 不,分配了 1000 次 type 被取消引用的str,在本例中为sizeof * str * 1000 --> 1 * 1000,而不是根据您的comment“可能是数百万字节”。建议使用printf("%zu\n", sizeof *str * 1000);进行测试
    • 我断言 str = malloc(sizeof *str * 1000);str=malloc(sizeof(char)*1000); 更容易编码,更不容易出错,更容易审查和维护 - IMO 拥有 30 多年的 C 经验。
    • 与其用“你显然不知道 c”来评论评论者,并像“我非常清楚那里有很多糟糕的程序员”这样冷嘲热讽,不如专注于评论/帖子/自己回答。这是专业的,这个网站有be nice 政策。
    【解决方案3】:

    你必须在声明指针后给字符串分配内存。您可以使用 malloc 或 calloc 函数来实现。

    char *str = (char*) malloc(sizeof(char) * 100);
    

    char *str = (char*) calloc(100, sizeof(char));
    

    【讨论】:

    • 字符 *str; str=(char *)malloc(sizeof(char)*100); fgets(str,sizeof(str),stdin); printf("%s",str);当我运行这段代码时,即使我输入很大,也只打印 7 个字符。你能告诉我原因吗?
    • 我以前使用过 fgets,但对我来说效果不佳!我会建议使用 fscanf 而不是 fgets。可以这样写 fscanf(stdin, "%s", str);
    猜你喜欢
    • 2017-07-06
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多