zoukankan      html  css  js  c++  java
  • C语言输入字符串

    首先强调一点,C语言没有字符串的概念!所谓的字符串实际上还是以数组形式保存的。

    方法1  —— 通过"%s"输入

    优点:简单明了,输入字符只要不大于数组长度都可以。

    #include <stdio.h>
    
    int main() {
        char s[100]="\0";//数组初始化
        scanf("%s",s);
        for(int i=0;i<100;i++){//打印输入的一串字符
            printf("%c",s[i]);
        }
    }

    输入:asdfasdfasd12341234

    输出:asdfasdfasd12341234

    方法2 —— 通过for循环输入

    缺点:输入的数长度固定,并且空格和换行符都会被判定为输入字符。

    #include <stdio.h>
    
    int main() {
        char s[100]="\0";//初始化
        for(int j=0;j<10;j++){//定义输入10个字符
            scanf("%c",&s[j]);//逐个获取输入字符(包括空格和换行符)
        }
        for(int i=0;i<100;i++){//打印输入
            printf("%c",s[i]);
        }
    }

    输入:asd 123 hjk

    输出:asd 123 hj

    方法3 —— 通过gets()输入

    使用gets()应注意: gets() 函数从标准输入读入 一行文本,直到读到 新行符 或 EOF 字符 之前,不会停止读入文本。也就是:gets() 不检查边界。因此,当变量空间 小于 一行字符串 时, 使用 gets() 会造成 溢出,程序出错。

    #include <stdio.h>
    
    int main() {
        char s[100]="\0";        //初始化
        gets(s);                //获取输入
        for(int i=0;i<100;i++){ //打印输入
            printf("%c",s[i]);
        }
    }

    运行结果:会提示 warning: this program uses gets(), which is unsafe.

    原因就是:gets() 函数从标准输入读入 一行文本,直到读到 新行符 或 EOF 字符 之前,不会停止读入文本。也就是:gets() 不检查边界。因此,当变量空间 小于 一行字符串 时, 使用 gets() 会造成 溢出,程序出错。

    那么什么时候会出错呢?看下面这种情况

    #include <stdio.h>
    
    int main() {
        int n=0;
        char s[100]="\0";
        scanf("%d",&n);            //获取 n 的值
        gets(s);                //获取 s 字符数组
        
        printf("%d\n",n);        //打印 n 的值
        for(int i=0;i<100;i++){    //打印 s 字符数组
            printf("%c",s[i]);
        }
    }

    运行结果:

    为什么 gets()没有被执行呢?

    原因是在 gets() 之前有 scanf() ,当输入5之后敲了回车(enter)然而回车并没有没有被n接收让gets()给接收了,gets()接收回车之后就结束输入了。

    所以gets()并不是没有执行而是接收了回车解决办法如下。

    #include <stdio.h>
    
    int main() {
        int n=0;
        char s[100]="\0";
        scanf("%d",&n);            //获取 n 的值
        getchar();            //接收回车符
        gets(s);                //获取 s 字符数组
        
        printf("%d\n",n);        //打印 n 的值
        for(int i=0;i<100;i++){    //打印 s 字符数组
            printf("%c",s[i]);
        }
    }

    在 scanf() 和 gets() 之间插入 getchar() 用于接收 回车符。

  • 相关阅读:
    XML错误信息Referenced file contains errors (http://www.springframework.org/schema/beans/spring-beans-4.0.xsd). For more information, right click on the message in the Problems View ...
    Description Resource Path Location Type Cannot change version of project facet Dynamic Web Module to 2.3.
    maven创建web报错Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins:maven-compiler-plugin:maven-compiler-plugin:3.5.1:runtime Cause: error in opening zip file
    AJAX跨域
    JavaWeb学习总结(转载)
    JDBC学习笔记
    Java动态代理之JDK实现和CGlib实现
    (转)看懂UML类图
    spring boot配置使用fastjson
    python3下django连接mysql数据库
  • 原文地址:https://www.cnblogs.com/easyidea/p/10015289.html
Copyright © 2011-2022 走看看