scanf字符串

知识
少中老师 2019-07-17 16:56:27

char s[10];
scanf("%s",s);
改为scanf("%s",&s);也正确,为什么?
求解释:s与&s都表示地址,且值相等。

  • s与&s类型不一样,s的类型为char *,&s的类型为char (*)[10],即指向一行有10个字符的指针。

  • 在scanf("%s",&s);语句中,&s有一个隐含的强制类型转换,即相当于scanf("%s",(char *)&s);

    扩展资料:

    1. scanf()是C语言中的一个输入函数。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

    2. scanf的发展:使用scanf函数进行输入,必须指定输入的数据的类型和格式,不仅繁琐复杂,而且很容易出错。C++保留scanf只是为了和C兼容,以便过去用C语言写的程序可以在C++的环境下运行。C++的编程人员都愿意使用cin进行输入,很少使用scanf。

  • #scanf字符串#

    返回顶部

    影响力:779

    使用scanf输入字符串时报错

    描述: 程序如图所示,定义了一个结构体数组,结构体中的name是用来储存字符串的,在主函数中,使用scanf_s对结构体的name赋值,实际运行过程中,每次输字符串的时候都会报错,求教是哪里写的... 程序如图所示,定义了一个结构体数组,结构体中的name是用来储存字符串的,在主函数中,使用scanf_s对结构体的name赋值,实际运行过程中,每次输字符串的时候都会报错,求教是哪里写的不对了,还是说跟我使用的scanf_s有关系?软件是vs 2015


    图总共四张,点击箭头可以看其他两张
    展开

    这个解答帮助过4552人

    scanf_s需要指定缓冲区长度,你试试

    scanf_s("%s", pstu[i].name, 10);

    追问

    基本可以确定是scanf_s的锅了,我换了visual c++编译这个程序,把scanf_s改成了scanf,运行完全正常,没有报错,然后按照你说的的在vs 2015那个程序里指定了缓冲区长度,运行也正常了。我还有一个额外的问题,scanf_s这个缓冲区是什么机制,还有scanf_s("%s", pstu[i].name, 10);这段代码,是不是只有在处理字符串数组时,才会用到10这个参数

    编辑时间 2019-01-13 12:17:25
    影响力:1315

    c语言中,如何将一个字符串通过scanf赋给二维字符数组的其中一行?

    描述: 若要输入几个字符串,如何通过scanf将这些字符串分别赋给a[i][j]中的一行,即使a[1][i],a[2][i]等为所输入的字符串中的一个??... 若要输入几个字符串,如何通过scanf将这些字符串分别赋给a[i][j]中的一行,即使a[1][i],a[2][i]等为所输入的字符串中的一个??
    这个解答帮助过8045人

    scanf("%s",a[i]);
    即可,a[i]为你想输入到的行数。

    满意请采纳!

    追问

    i可否为一变量?这样行吗
    char b[3][10];
    int a;
    for (a=0;a=2;a++) scanf ("%s /n",&b[a]);

    追答

    可以,但是scanf不用\n,而且字符数组不用取地址符

    编辑时间 2019-11-18
    影响力:2530

    C语言结构体成员变量的中字符串型数值型在一个scanf函数里输入的问题

    描述: #include<stdio.h>#include<stdlib.h>structstu{charname[10];intnum;intage;charaddr[15];}sa[3],sb[3],*pp,*qq;//创建结构体类型structstu的同时,定义结构体数组sa、sb,定义结构体... #include <stdio.h>
    #include <stdlib.h>
    struct stu
    {
    char name[10];
    int num;
    int age;
    char addr[15];
    }sa[3],sb[3],*pp,*qq; //创建结构体类型struct stu的同时,定义结构体数组sa、sb,定义结构体指针变量 pp、qq。
    int main()
    {
    FILE *fp;
    char ch;
    int i;
    if((fp=fopen("D:\\学习\\C语言源码\\devC++\\第13章 文件\\stu_list.txt","w"))==NULL) //以只写的方式打开文件 ,没有该文件的情况下会创建该文件
    {
    printf("Cannot open file,press any key to exit");
    getchar();
    exit(0);
    }
    printf("input data\n");
    pp=sa;
    for(i=0;i<3;i++,pp++)
    {
    scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr); //先用scanf给结构体的成员变量赋值
    fprintf(fp,"%s%d%d%s\n",pp->name,pp->num,pp->age,pp->addr); //然后用fprintf将结构体成员变量的值写入fp所指向的文件stu_list.txt中去
    }
    fclose(fp); //完成写入文件操作后,关闭文件,使指针fp不再指向该文件

    fp=fopen("D:\\学习\\C语言源码\\devC++\\第13章 文件\\stu_list.txt","r"); //以只读的方式打开文件
    qq=sb;
    printf("name\tnumber age addr\n");
    for(i=0;i<3;i++,qq++)
    {
    fscanf(fp,"%s%d%d%s",qq->name,&qq->num,&qq->age,qq->addr); //先用fscanf将fp所指向的文件stu_list.txt中的值读取到结构体成员变量中
    printf("%s\t%5d%3d%s\n",qq->name,qq->num,qq->age,qq->addr); //然后用printf输出结构体变量的值
    }
    fclose(fp); //完成读取文件操作后,关闭文件,使指针fp不再指向该文件
    }

    我要如何输入,才能保证4个成员变量都被成功赋值,而不是都输入到了第一个字符串成员变量里
    展开
    这个解答帮助过8778人

    //修改了一点,注意看说明 
    #include <stdio.h> 
    #include <stdlib.h>
    struct stu
    {
    char name[10];
    int num;
    int age;
    char addr[15];
    }sa[3],sb[3],*pp,*qq; //创建结构体类型struct stu的同时,定义结构体数组sa、sb,定义结构体指针变量 pp、qq。 
    int main()
    {
    FILE *fp;
    char ch;
    int i;
    if((fp=fopen("D:\\学习\\C语言源码\\devC++\\第13章 文件\\stu_list.txt","w"))==NULL) //以只写的方式打开文件 ,没有该文件的情况下会创建该文件 
    {
    printf("Cannot open file,press any key to exit");
    getchar();
    exit(0);
    }
    printf("input data\n");
    pp=sa;
    for(i=0;i<3;i++,pp++)
    {
    scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr); //先用scanf给结构体的成员变量赋值 
    //在下在这句多加几个空格,作为输入数据的分隔符,注意输入的人名和地址中应该没有空格,不然会出错 
    //或者文件的输入和输出全部指定宽度 
    fprintf(fp,"%s %d %d %s\n",pp->name,pp->num,pp->age,pp->addr); //然后用fprintf将结构体成员变量的值写入fp所指向的文件stu_list.txt中去 
    }
    fclose(fp); //完成写入文件操作后,关闭文件,使指针fp不再指向该文件 

    fp=fopen("D:\\学习\\C语言源码\\devC++\\第13章 文件\\stu_list.txt","r"); //以只读的方式打开文件 
    qq=sb;
    printf("name\tnumber age addr\n");
    for(i=0;i<3;i++,qq++)
    {
    fscanf(fp,"%s%d%d%s",qq->name,&qq->num,&qq->age,qq->addr); //先用fscanf将fp所指向的文件stu_list.txt中的值读取到结构体成员变量中 
    printf("%s\t%5d%3d%s\n",qq->name,qq->num,qq->age,qq->addr); //然后用printf输出结构体变量的值 
    }
    fclose(fp); //完成读取文件操作后,关闭文件,使指针fp不再指向该文件 
    }

    编辑时间 2019-05-20
    影响力:122

    scanf_s()传递的参数太多?

    描述: 在VS2017里写C。floatinch=0.0f;scanf_s("%f",&inch,sizeof(inch));为什么下面提示警告scanf_s格式字符串中提供的参数太多?因为scanf_S是需要检查边界的呀,所以不是应该有sizeof来限... 在VS2017里写C。
    float inch=0.0f;
    scanf_s("%f",&inch,sizeof(inch));

    为什么下面提示警告scanf_s格式字符串中提供的参数太多?
    因为scanf_S是需要检查边界的呀,所以不是应该有sizeof来限制的吗?
    当我删掉sizeof参数的时候,警告消失……
    请问这是什么情况?
    展开
    这个解答帮助过2036人

    通常 格式 %s 时才有必要 加上 长度。
    另外,长度参数 是 unsigned 型, 而不是 size_t 型, 可以直接写整形常数,sizeof()得到的是 size_t 型。

    编辑时间 2019-06-16
    影响力:4512

    c语言scanf怎么同时输入两个字符

    描述: 这段代码编译发生错误,错在那你,请指点,谢谢... 这段代码编译发生错误,错在那你,请指点,谢谢

    这个解答帮助过1901人

    scanf_s("%c %c", &sh, sizeof(sh), &cd, sizeof(cd));
    sizeof(sh) 这个参数就是要读取的长度
    嫌麻烦就用scanf ,vs中不能用的话就在文件开头加入#define _CRT_SECURE_NO_WARNINGS

    编辑时间 2019-02-06
    影响力:2139

    C语言中关于scanf输入字符问题大神速来

    描述: #inculde<stdio.h>intmain(void)charchscanf("%c",&ch)printf("ch=%c\n",ch)这里输入一个c为什么输出还是c,而不是c的ASCII的值... #inculde<stdio.h>
    int main(void)
    char ch
    scanf("%c",&ch)
    printf("ch=%c\n",ch)
    这里输入一个c为什么输出还是c,而不是c的ASCII的值
    这个解答帮助过3227人

    原因是在input函数里面有接受用户输入的动作,而输入一定是以回车结束,那么这个回车就会残留在缓存中,而当你的scanf读取flag的时候,程序会自动获取前面的那个回车符号,这就是用%c会自动跳过的原因,而用%s的话,程序就会等待下一行输入,回车符号并不会被接收,建议在scanf("%c", &flag);修改为:
    fflush(stdin); //清空缓存
    scanf("%c", &flag);

    编辑时间 2019-04-04
    影响力:1306

    scanf读取字符串时为何把空格读进去了?

    描述: scanf读取字符串时为何把空格读进去了?按图片输入为什么emp[i].sex把空格读进去了而emp[i].name却没有把空格读进去?#include"stdio.h"#defineN3structemployee{intnum;charname[15]... scanf读取字符串时为何把空格读进去了?按图片输入为什么emp[i].sex把空格读进去了而emp[i].name却没有把空格读进去?
    #include "stdio.h"
    #define N 3
    struct employee
    {
    int num;
    char name[15];
    char sex[10];
    short age;
    char addr[20];
    float salary;
    char health[10];
    char degree[10];
    }emp[N];
    int main()
    {
    FILE *fp;
    int i;
    for(i=0;i<N;i++)
    {
    printf("请输入员工信息\n");
    scanf("%d%s%c%d%s%f%s%s",&emp[i].num,emp[i].name,emp[i].sex,&emp[i].age,emp[i].addr,&emp[i].salary,emp[i].health,emp[i].degree);
    }

    展开

    这个解答帮助过9082人

    这是因为%s、%d都会忽略开头遇到的空格,遇到空格则结束读入;而%c则把空格也当作是一个有效字符读取了。

    追问

    但是改成字符串s还是这样啊,依旧读空格

    就是从addr字符串输入开始就出问题了

    追答

    读入%d,%f时,都要用&取地址符的

    追问

    用了啊

    追答

    把代码复制上来看。

    更多追问

    编辑时间 2019-10-19
    影响力:4916

    为什么是D呢?关于字符串的scanf输入问题

    这个解答帮助过5156人

    scanf函数里面的参数有两个,第一个是字符串,就是双引号部分,第二个参数是一个地址,而数组名就是一个地址了

    追答

    c选项后面的str[10]不是一个数组的地址了,而是str数组里面第10号元素的地址

    编辑时间 2019-05-11
    影响力:3435

    scanf输入后printf为什么无法输出?

    描述: #include<stdio.h>/**/intmain(){inta,b,z;printf("请输入a的值");scanf("%a",&a);getchar();printf("请输入b的值");scanf("%b",&b);getchar();z=a+b;printf("a+b=%d",z);return0;}... #include<stdio.h>
    /*

    */
    int main(){
    int a,b,z;
    printf("请输入a的值 ");
    scanf("%a",&a);
    getchar();
    printf("请输入b的值 ");
    scanf("%b",&b);
    getchar();
    z=a+b;
    printf("a+b=%d",z);

    return 0;

    }
    这个解答帮助过16人

    代码有错误,原因是 scanf第一个参数是格式控制字符串, int的输入格式为%d
    具体修改如下:
    scanf("%a",&a); 修改为 scanf("%d",&a);
    scanf("%b",&b); 修改为 scanf("%d",&b);

    编辑时间 2019-07-24