Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么要放一个'&';在a给我想要的结果之前?_C_String_Printing - Fatal编程技术网

C 为什么要放一个'&';在a给我想要的结果之前?

C 为什么要放一个'&';在a给我想要的结果之前?,c,string,printing,C,String,Printing,我刚刚开始学习C语言,不太了解一些东西是如何工作的。我想制作一个程序,它接受字符串的输入并按原样打印。 这是我写的程序:- #include <stdio.h> int main() { char a; scanf("%s",&a); printf("%s",a); } #包括 int main() { 字符a; scanf(“%s”、&a); printf(“%s”,a); } 我的第一个问题是没有任何输出

我刚刚开始学习C语言,不太了解一些东西是如何工作的。我想制作一个程序,它接受字符串的输入并按原样打印。 这是我写的程序:-

#include <stdio.h>
int main()
{
    char a;
    scanf("%s",&a);
    printf("%s",a);
}
#包括
int main()
{
字符a;
scanf(“%s”、&a);
printf(“%s”,a);
}
我的第一个问题是没有任何输出。甚至不是我期望的第一个角色。 其次,当我在print语句变量前面加上一个“&”时,它的效果很好,即打印整个字符串

#include <stdio.h>
int main()
{
    char a;
    scanf("%s",&a);
    printf("%s",&a);
}
#包括
int main()
{
字符a;
scanf(“%s”、&a);
printf(“%s”,和a);
}

为什么会发生这种情况?

如果您想在
字符中读取
类型,正确的格式说明符是
%c
而不是
%s
如果您想在
字符中读取
类型,正确的格式说明符是
%c
而不是
%s
在c中,每个变量都有自己的地址。当我们想要读取某些内容时,我们分别发送地址(并使用
&
从变量中获取地址)

原因是,
scanf()
需要修改a和b的值,但它们是scanf()的本地值

所以为了反映主函数变量a和b的变化,我们需要传递它们的地址。我们不能简单地按价值传递它们

例如:

scanf("%d %d", &a, &b);
但是,如果使用
printf()
函数,因为我们只在输出控制台中打印变量的值,所以变量a和b的值不会发生任何更改。因此,不需要发送他们的地址

printf()的示例:


(另外,如果您想扫描字符,必须使用%c而不是%s)

在c中,每个变量都有自己的地址。当我们想要读取某些内容时,我们分别发送地址(并使用
&
从变量中获取地址)

原因是,
scanf()
需要修改a和b的值,但它们是scanf()的本地值

所以为了反映主函数变量a和b的变化,我们需要传递它们的地址。我们不能简单地按价值传递它们

例如:

scanf("%d %d", &a, &b);
但是,如果使用
printf()
函数,因为我们只在输出控制台中打印变量的值,所以变量a和b的值不会发生任何更改。因此,不需要发送他们的地址

printf()的示例:

(另外,如果您想扫描字符,您必须使用%c而不是%s)

您是第二个示例,我的示例似乎有效,但实际上您正在调用未定义的行为,因此可能会发生任何事情

详细内容:

  • 您有一个
    字符a
    ,并调用
    scanf(“%s”,&a)
    ;但是在这里,
    scanf()
    会将整个以NUL结尾的字符串复制到您传递的地址中,因此即使您只键入一个字符,scanf也会将该字符复制到a中,并将调用未定义行为的
    '\0'
    复制到
    &a+1
    中,因此您的程序可能会崩溃、覆盖其他变量或。。。。如果要扫描整个字符串,必须定义一个数组,如
    chars[1024]
    并调用
    scanf(“%s,s”)
    。如果要扫描单个字符,请调用
    scanf(“%c”,“a”);
  • scanf()
    printf(“%s”,…)
    中的链接用于打印整个字符串,因此需要一个
    char*
    参数。这就是为什么在第一个示例中它没有打印任何内容(事实上,它又是未定义的行为)。要打印单个字符,请调用
    printf(“%c”,a);
  • 你是我的第二个例子,看起来很有效,但事实上你正在调用未定义的行为,所以任何事情都可能发生

    详细内容:

  • 您有一个
    字符a
    并调用
    scanf(“%s”,&a)
    ;但是这里是
    scanf()
    会将整个以NUL结尾的字符串复制到您传递的地址中,因此即使您只键入一个字符,scanf也会将该字符复制到a中,
    '\0'
    将调用未定义行为的内容复制到
    &a+1
    中,因此您的程序可能会崩溃、覆盖其他变量或…如果您想扫描整个字符串,请必须定义一个数组,如
    chars[1024];
    并调用
    scanf(“%s,s”)
    。如果要扫描单个字符,请调用
    scanf(“%c”、&a)
  • scanf()
    printf(“%s”,…)
    中的链接用于打印整个字符串,因此需要一个
    char*
    参数。这就是为什么在第一个示例中它没有打印任何内容(事实上,它又是一个未定义的行为)。要打印单个字符,请调用
    printf(“%c”,a)
  • 有几件事:

  • char
    类型存储单个字符,而不是字符串。要存储字符串,您需要留出一个字符数组:
    char a[20]; // stores a string up to 19 characters long
  • 在C语言中,字符串是包含0值终止符的字符值序列。字符串存储在字符类型的数组中。由于该终止符,您需要一个宽度至少为N+1个元素的数组,以便存储长度为N个字符的字符串。
  • %s
    用于
    printf
    scanf
    的转换说明符期望其相应的参数具有type
    char*
    ,而不是
    char
    ——它期望的是
    char
    数组的第一个元素的地址。
  • 除非它是
    sizeof
    或一元
    &
    运算符的操作数,或者是用于初始化声明中字符数组的字符串文字,否则“T
  • 的N元素数组”类型的表达式将转换(“衰减”)为“指向
    T
    的指针”类型的表达式,表达式的值将是第一个元素的地址。 将所有这些放在一起,您需要进行以下更改:

    #include <stdio.h>
    
    #define LENGTH 20
    #define EXPAND(x) #x            // I'll explain this in more detail below
    #define STR(x) EXPAND(x)
    #define LENGTH_FMT STR(LENGTH)
    
    int main( void )
    {
      char a[LENGTH+1];
      scanf( "%" LENGTH_FMT "s", a );
      printf( "%s\n", a );
      return 0;
    }
    
    扩展到

    "%" STR(LENGTH) "%s"
    
    "%" EXPAND(20) "%s"
    
    "%" #20 "s"
    
    "%" "20" "s"
    
    扩展到

    "%" STR(LENGTH) "%s"
    
    "%" EXPAND(20) "%s"
    
    "%" #20 "s"
    
    "%" "20" "s"
    
    扩展到

    "%" STR(LENGTH) "%s"
    
    "%" EXPAND(20) "%s"
    
    "%" #20 "s"
    
    "%" "20" "s"
    
    哪个