首页 > 解决方案 > C: 问题 printf 和 scanf

问题描述

#include <stdio.h>

int main()

{

char name[90];
int age;
char letter;

printf("What is your name?\n");
scanf("%s", &name);

printf("How old are you?\n");
scanf("%d", &age);

printf("Where are you from?\n");
scanf("%s", &letter);

printf("Your name is %s, You are %d, You are from %s\n");
return 0;}

块引用

这是我的代码,但不能正常工作。

你的名字是 å[N ⌂,你是 1323785094,你来自.----- 我开始了。

标签: c

解决方案


您的代码中存在三个主要问题:

  1. scanf("%s", &name);

    格式说明%s符期望参数是指向数组第一个元素的指针,并且类型为char *. 由于name是一个数组,&name是一个指向数组本身的指针,并且类型为char (*)[90].

    要获取指向第一个元素的指针,请使用&name[0]或 plainname作为数组自然衰减为指向其第一个元素的指针。

  2. scanf("%s", &letter);

    如前所述,%s格式需要一个指向数组第一个元素的指针。'\0'它会在它读取的字符之后将字符串空终止符添加到数组中。

    这意味着即使是单个字符也会将两个字符写入“数组”。

    对于单个字符,请使用%c格式说明符。但请注意,您很可能需要格式中的前导空格,以跳过任何前导空格(如前一个输入中的换行符):

    scanf(" %c", &letter);
    
  3. printf("Your name is %s, You are %d, You are from %s\n");

    在这里,您告诉printf打印一些参数,但您不提供实际参数。

    另请注意,scanf要打印单个字母,您需要使用以下%c格式:

    printf("Your name is %s, You are %d, You are from %c\n", name, age, letter);
    

这里列出的所有三个问题本身都会导致未定义的行为


推荐阅读