c语言,char,int用法

已知有声明“char ch;int a;”执行语句语句scanf (“% c % d” ,&ch,&a)如果从键盘输入的数据是123则变量a得到的值是

a = 23 , 1 被 %c 接收

%和c之间有空格,ch和a一个都没法正确赋值

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/1087317
  • 这篇博客也不错, 你可以看下C语言scanf(“%d”,&a)输入非数字字符
  • 除此之外, 这篇博客: C语言学习中的 scanf("%d",&n); 但输入字符 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    应当输入数字,如果输入字母,scanf 语句执行失败。

    int flag;
    flag = scanf("%d",&n);
    if (flag== 1) printf("good\n"); else printf("bad\n");

    flag = scanf("%d",&n); 送返成功读入的数据个数。拍入字母,flag 得0,n 原有值不变。

    由于输入流里的你拍入的字母 没有被清掉,后面的输入语句连续执行失败。可以用 fflush(stdin); 清除 多余的东西。

    #include <iostream>
    using namespace std;
    int main(){
        int tmp,t,a[1000],count=0;
        while((t=scanf("%d",&tmp)) != EOF){
            if(!t)
                //scanf函数接收整型数字要跳过所有非数字的字符专接收数字。那么如果输入了字符它就一直留在输入缓冲区
                //只要缓冲区有字符,scanf就要去读,一读不是数字,它就跳过。 
                fflush(stdin);//此函数可以清除缓冲区中的字符 
            else
                a[count++] = tmp;
        }
        for(int i=0; i<count; i++){
            cout<<i+1<<"***"<<a[i]<<endl;
        }
        return 0;
    }
    ————————————————
    版权声明:本文为CSDN博主「liubin477」的原创文章,遵循 CC 4.0 BY-SA 版权协议。
    原文链接:https://blog.csdn.net/qq_36668065/article/details/80154588

    总结:用scanf("%d",&x);为变量赋值整数时,应用以下代码过滤:(这是原创不是转载) 

     

    while(!scanf("%d",&x))        //若输入的不是数字,返回0,知道输入的是数字为止
    {
       printf("[Warining] You must input number!\n");
       fflush(stdin);     //输入的不是数字就清空缓冲区
     }

    养成一个每次用完scanf()函数时就清空缓冲区。以免影响程序的正常运行。 为此,自己编写了一个过滤非数字输入的scanf函数:

    #define INT 1

     int a;  myScanfInt(INT,&a);

    void myScanfInt(int datatype,int *p)
    {
        if(datatype==INT)
            while(!scanf("%d",p))
            {
                printf("[Waring] You must input a number!\n");
                fflush(stdin);
            }
        fflush(stdin);
    }
     

    删除e69da5e6ba90e799bee5baa6e997aee7ad9431333337616635文件部分内容的大概步骤:新建一个临时文件,把原文件内容向临时文件里拷贝,遇到要删除的内容就跳过。结束后关闭文件,用remove("原文件名");把原

    文件删除,用rename("临时文件名","原文件名");把临时文件名改为原文件名。2、例如在原文件123.txt中删除以2和以4编号开头的行,可用以下代码实现:

     

    #include "stdio.h"

    #include "stdlib.h"

    int main(void){

        FILE *fin,*ftp;

        char a[1000];

        fin=fopen("123.txt","r");//读打开原文件123.txt

        ftp=fopen("tmp.txt","w");//写打开临时文件tmp.txt

        if(fin==NULL || ftp==NULL){

            printf("Open the file failure...\n");

            exit(0);

        }

        while(fgets(a,1000,fin))//从原文件读取一行

            if(a[0]!='2' && a[0]!='4')//检验是要删除的行吗?

                fputs(a,ftp);//不是则将这一行写入临时文件tmp.txt

        fclose(fin);

        fclose(ftp);

        remove("123.txt");//删除原文件

        rename("tmp.txt","123.txt");//将临时文件名改为原文件名

        return 0;

    }

     

  • 以下回答来自chatgpt:

    问题:当声明“char ch; int a;”并执行语句“scanf (“%c %d” ,&ch,&a)”时,如果从键盘输入123,变量a将获得什么值?

    优化后的问题:在C语言中,使用scanf()函数输入字符和整数时,如何避免出现混乱或错误的输入,并确保得到正确的值?

    解决方案: 1. 在使用scanf()函数读取字符或字符串之前,需要清空输入缓冲区以避免出现意外的字符或字符串:

    while(getchar() != '\n');
    

    这个循环会一直读取输入缓冲区中的字符,直到缓冲区为空,也就是读到了回车符为止。

    1. 为了确保输入的字符和整数值被正确读取,应该在scanf()函数调用中使用正确的格式化说明符。对于输入一个字符,使用%c格式化说明符,而对于输入一个整数,使用%d格式化说明符,并且在字符和整数之间放置一个空格:
    scanf("%c %d", &ch, &a);
    
    1. 如果用户输入的字符串中包含不需要的字符,例如多余的空格或回车符,可以使用scanf()函数的特殊语法来读取和丢弃缓冲区中的任意字符。例如,使用%s格式化说明符来读取和丢弃一个字符串,使用%c格式化说明符来读取和丢弃单个字符:
    scanf("%c%*c%d", &ch, &a);
    
    1. 最后,根据题目的条件,输入的字符串是“123”,这意味着字符’1′、字符’2′和字符’3′将被读取为字符变量ch的值,并且整数变量a将被设置为23。这是因为scanf()函数遇到非数字字符时就停止读取,所以它只读取了4个未被格式化的字符:’1′、’2′、’3′和回车符。为了得到正确的整数值,需要对字符数组进行转换或使用其他方法来提取数值。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^