为什么使用Scanf时C程序输出奇怪的结果?

3

我正在学习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 indicates base address, so use either %u or %p as printf("%u", array); usage of scanf is wrong use as scanf("%s",array); - csavvy
2
@csavvy 通过地址,我指的是输出我在字符变量中输入的字符串并输出相同的字符串。而不是变量的地址。此外,对于数组 AFAIK 我们可以使用 scanf(%s, array)。 - technextgen
4个回答

2

只需正确使用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。当未使用格式说明符时,目标变量的值不会改变(在这种情况下未定义,因为数组包含在分配变量的堆栈上的字节)。


嘿,使用代码后我只能输出第一组字符。例如:输入您的地址 :Qwerty ash asjdhjas hdkajs 地址是:Qwerty 它只输出第一个单词而不是整个内容。 - technextgen
1
@technextgen scanf会在第一个换行符(按下Enter键)处停止。 - Jabberwocky
@Jabberwocky 我正在输入一个带有空格的单行。scanf不能识别空格吗? - technextgen
1
@technextgen 是的,它确实会发生。这是在这里发生的:您的输入 Foo Barscanf("%39s",array); 将读取 Fooprintf(... 将打印 Foo,然后您的程序结束,没有人读取 Bar - Jabberwocky
1
再次查看scanf函数的man页(我必须承认我自己并没有仔细阅读)。 %s 格式读取字符串直到下一个空格;如果您想要读取至行尾,可以使用 fgets() 或格式 %[^\n] - Hans-Martin Mosner

1

两个问题:

  • 你没有正确初始化array。应该这样写:

    char array[40] = "";

  • 你混淆了scanf和printf,导致这个语句出错:

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

    应该拆成:

    printf( "Enter your address: " );

    scanf ("%39s", array);


2
不初始化会有什么影响?scanf()在将输入写入数组后,不会自动追加NUL终止符吗? - underscore_d

1

scanf的man页面得知:

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

未定义输出的原因:

format中的每个转换说明符都以字符“%”或字符序列“%n$”开头。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接