【问题标题】:Why is the C program giving weird output using Scanf?为什么 C 程序使用 Scanf 给出奇怪的输出?
【发布时间】:2021-03-12 07:50:53
【问题描述】:

我目前正在学习 C 编程,我遇到了这个奇怪的输出。

// Program will try functionalities of the scanf function
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char const *argv[])
{
    char array[40];
    scanf("Enter your address: %39s",array);   //39 + 1/o null character at the end of the character array.
    printf("The address is : %s", array);
    return 0;
}

它应该接受输入地址并输出相同。

PS C:\Users\G\Documents\C programs> gcc scanff.c -o scanff -Wall -pedantic -std=c99
PS C:\Users\G\Documents\C programs> ./scanff
jhgjhg
The address is : ■   a

那个黑块是什么?谁能解释一下! 谢谢。

【问题讨论】:

  • array 表示基地址,所以使用%u%p 作为printf("%u", array); 使用scanf 是错误使用scanf("%s",array);
  • @csavvy 通过地址,我的意思是输出我在字符变量中输入的字符串并输出相同的内容。不是变量的地址。此外,对于数组 AFAIK,我们可以使用 scanf(%s, array)

标签: c printf scanf


【解决方案1】:

只需为scanf() 函数正确使用格式说明符,并使用printf() 显示自定义消息。

看看下面的代码:

// Program will try functionalities of the scanf function
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char const *argv[])
{
    char array[40];
    printf("Enter your address: ");
    scanf("%39s",array);   //39 + 1/o null character at the end of the character array.
    printf("The address is : %s", array);
    return 0;
}

【讨论】:

    【解决方案2】:

    您应该再次查看 scanf 的文档。 格式字符串应包含格式规范和要按字面匹配的非格式字符。 您似乎认为可以使用scanf() 进行提示,这是不正确的。

    使用此(未经测试的)代码您可能会取得更大的成功:

    int main(int argc, char const *argv[])
    {
        char array[40];
        printf("Enter your address: ");
        scanf("%39s",array);   //39 + 1/o null character at the end of the character array.
        printf("The address is : %s\n", array);
        return 0;
    }
    

    检查scanf() 调用的结果以查看是否读取了预期数量的值也是一种很好的做法。在您的情况下,该值可能为 0,因为您的输入中的文字字符不匹配。当不使用格式规范时,目标变量的值不变(在这种情况下未定义,因为数组包含恰好位于分配变量的堆栈上的字节。)

    【讨论】:

    • 嘿,使用代码后,我只能输出第一组字符。喜欢:Enter your address :Qwerty ash asjdhjas hdkajs The address is : Qwerty 它只是输出第一个单词而不是全部内容
    • @technextgen scanf 将在第一个换行符处停止(按下 Enter 键)
    • @Jabberwocky 我在一行中输入空格。 scanf 不识别空格吗?
    • @technextgen 是的。这发生在这里:您的输入Foo Barscanf("%39s",array); 将读取Fooprintf(... 将打印Foo,然后您的程序结束并且没有人读取Bar
    • 再次查看 scanf 的手册页(我必须承认我自己并没有仔细查看)。 %s 格式将字符串读取到下一个空格;如果您想读到行尾,可以使用fgets()%[^\n] 格式。
    【解决方案3】:

    两个问题:

    • 您没有正确初始化array。应该是:

      char array[40] = "";

    • 你把 scanf 和 printf 和这个语句混为一谈了:

      scanf("Enter your address: %39s",array);

      应该分解成:

      printf( "Enter your address: " );

      scanf ("%39s", array);

    【讨论】:

    • 不初始化怎么办?将输入写入数组后,scanf() 不会自己附加一个 NUL 终止符吗?
    【解决方案4】:

    来自scanf的手册页:

    int scanf(const char *format, ...);

    未定义输出的原因:

    format 中的每个转换规范都以 字符“%”或字符序列“%n$”

    解决方案:将scanf("Enter your address: %39s",array);改为scanf("%39s",array);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 2022-11-16
      • 2017-04-29
      相关资源
      最近更新 更多