精华内容
下载资源
问答
  • c语言键盘输入字符串

    万次阅读 2018-10-21 15:15:52
    #include<stdio.h> #include<...// 输入三个字符:每输入一个字符就要用空格或回车间隔,结束时输入回车 int main(){ char b[4]; for(int i = 0;i < 3;i++) { scanf("%c",&am...

     

    #include<stdio.h>
    #include<string.h>
    // 输入三个字符:每输入一个字符就要用空格或回车间隔,结束时输入回车
    int main(){
        char b[4];
        for(int i = 0;i < 3;i++)
        {
            scanf("%c",&b[i]);
            getchar(); //吸收缓存区中的空格或回车
            if(i+1 == 3) 
                b[i+1] = '\0';   // 字符数组的结束符号
        }
        printf("%s\n",b);
    }

    这种方法是 一个字符一个字符地输入:

    字符与字符之间用空格或回车间隔,全部输入完毕后用回车结束

    getchar()方法是用来读取字符与字符之间的空格或者回车的,

    b[ i+1 ] = '\0' ; 用'\0'来结束字符串:如果去掉此块代码,b[2]之后会出现乱码

    解决办法:用 “” 空串来初始化数组  char s[50] = "";


    #include <stdio.h>
     
    int main()
    {
    	char s[50];	
    	scanf("%s",s);
    	printf("%s\n",s);
    	return 0;
    }
    

    直接输入一个字符串并存储。用“%s”读入,程序会自动在结束时加 结束符 '\0'

    推荐使用此方法,但是应该明白结束符 '\0' 的存在!!!


    #include<stdio.h>
    // 输入一串字符,再从缓冲区挨个读取
    int main(){
    	int i = 0;
    	char c;
    	char s[50] = ""; // 如果不初始化s[],系统会自动赋值 
    	scanf("%c",&c);
    	while(c != '\n'){
    		s[i] = c;
    		i++;
    //		printf("%c\n",s[i]);
    		scanf("%c",&c);
    	}
    	printf("%s\n",s);
    	return 0;
    } 

     

    直接输入一个字符串,程序在缓冲区中读取一个字符,

    如果次字符不是回车'\n',则存入字符数组,如果是回车则结束循环

    这里已经初始化了数组,所以不进行 '\0' 结束符赋值也不会有乱码

    这个方法虽然麻烦,但是可以在存储字符串时实现一些功能,比如判断字符是否为小写,如果不是则转换为小写

     

    展开全文
  • C语言scanf输入字符串,举例详解

    千次阅读 2020-05-12 18:24:55
    除了在定义字符数组时初始化外,还可以通过scanf从键盘输入字符串。下面写一个程序: #include <stdio.h> int main(void) { char str[10]; //str是string的缩写, 即字符串 printf("请输入字符串:"); scanf("%...

    除了在定义字符数组时初始化外,还可以通过scanf从键盘输入字符串。下面写一个程序:

    #include <stdio.h>
    int main(void)
    {
    char str[10];  //str是string的缩写, 即字符串
    printf("请输入字符串:");
    scanf("%s", str);  /*输入参数是已经定义好的“字符数组名”, 不用加&, 因为在C语言中数组名就代表该数组的起始地址*/
    printf("输出结果:%s\n", str);
    return 0;
    }
    

    输出结果是:
    请输入字符串:爱你一生一世
    输出结果:爱你一生一世

    用 scanf 给字符数组赋值不同于对数值型数组赋值。前面讲过,给数值型数组赋值时只能用 for 循环一个一个地赋值,不能整体赋值。而给字符数组赋值时可以直接赋值,不需要使用循环。此外从键盘输入后,系统会自动在最后添加结束标志符 ‘\0’。但是用 scanf 输入字符串时有一个地方需要注意:如果输入的字符串中带空格,比如“i love you”,那么就会有一个问题。我们将上面程序运行时输入的字符串改一下:

    #include <stdio.h>
    int main(void)
    {
    char str[10];  //str是string的缩写, 即字符串
    printf("请输入字符串:");
    scanf("%s", str);  //输入参数是已经定义好的字符数组名
    printf("输出结果:%s\n", str);
    return 0;
    }
    

    输出结果是:
    请输入字符串:i love you
    输出结果:i

    我们看到,输入的是“i love you”,而输出的只有“i”。原因是系统将空格作为输入字符串之间的分隔符。也就是说,只要一“敲”空格,系统就认为当前的字符串已经结束,接下来输入的是下一个字符串,所以只会将空格之前的字符串存储到定义好的字符数组中。

    那么这种情况该怎么办?那么就以空格为分隔符,数数有多少个字符串,有多少个字符串就定义多少个字符数组。比如“i love you”有两个空格,表示有三个字符串,那么就定义三个字符数组:

    #include <stdio.h>
    int main(void)
    {
    char str1[10], str2[10], str3[10];
    printf("请输入字符串:");
    scanf("%s%s%s", str1, str2, str3);
    printf("输出结果:%s %s %s\n", str1, str2, str3);  //%s间要加空格
    return 0;
    }
    

    输出结果是:
    请输入字符串:i love you
    输出结果:i love you

    需要注意的是,前面讲“清空缓冲区”的时候讲过,用 scanf 输入时,不管输入什么,最后“敲”的回车都会被留在缓冲区,这里也不例外。输入字符串时最后“敲”的回车也会被留在缓冲区,如果紧接着要给一个字符变量赋值的话,那么还没等你输入系统就自动退出来了。因为系统自动将回车产生的字符 ‘\n’ 赋给该字符变量了,所以此时对字符变量赋值前要首先清空缓冲区。

    转载:
    http://c.biancheng.net/view/232.html

    展开全文
  • C语言中从键盘输入字符串时的一些问题

    万次阅读 多人点赞 2019-05-17 20:52:10
    C语言中从键盘输入字符串时的一些问题 1.scanf() scanf()在输入字符串时有很大的弊端, 例如: 1). scanf()在从键盘读入字符时并不会根据所定义的字符数组的大小来控制读入多少个 , 而是从scanf( ) 中传入的地址开始...

    C语言中从键盘输入字符串时的一些问题

    1.scanf()

    scanf()在输入字符串时有很大的弊端, 例如:
    1). scanf()在从键盘读入字符时并不会根据所定义的字符数组的大小来控制读入多少个 , 而是从scanf( ) 中传入的地址开始一直访问下一个元素的内存 , 碰见空格符或者回车符时才停止读入并存入结束符’\0’ , 这就有可能造成了一个在C中非常严重的问题 , 访问非法内存 . 如果所输字符数量大于字符数组的长度 , 当scanf()将把字符存入字符数组的最后一个元素后 , scanf()还会继续往后访问内存 , 将接收的字符继续存入 , 但之后的内存是我们未申请的非法内存 , 会发生未知错误 , 例如以下代码:
    2). 第二点也就是第一点中的遇到空格符停止读入并存入结束符’\0’, 也就是说scanf()存不了空格符

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #define N 10
    void main() {
    	char str1[N];
    	printf("请输入字符串str1\n");
    	scanf("%s", str1);
    	printf("str1为:\n%s\n",str1);
    	system("pause");
    }
    

    代码中 , 字符数组最多存十个元素 , 结果却输出了超过十个的字符并发生了错误程序异常终止
    在这里插入图片描述

    2.gets()

    gets(char* str)函数 , gets()函数与scanf()类似 , 但读入时只碰见 '\n’才停止读入并自动加上 ‘\0’,也存在和scanf()一样的访问非法内存的可能 .

    最新版本的C标准(2011年)最终将该功能从其规范中删除。该函数在C ++中已弃用(截至2011年标准,遵循C99 + TC3)。所以不建议使用gets()函数

    3.fgets()

    fgets(char* str, int n,stdin )函数在输入字符串时是从标准输入流中读取一个长度为(n - 1)的字符串 , 并存放到字符数组str中
    其中n是要求得到的字符个数 , 但实际上只会读入(n - 1)个,在最后加一个’\0’ . 如果在读取完(n - 1)个字符之前碰见换行符’\n’ ,读入即结束, 但’\n’ 也会作为有效字符存入字符串中,然后在’\n’后再存入’\0’
    1). fgets( )函数的优点是不会再像scanf()函数一样发生访问非法内存的问题 , 也可以存如scanf()存不了的空格符
    2). 说起缺点 , fgets在取完(n - 1)个字符之前碰见换行符’\n’ ,’\n’ 也会作为有效字符存入字符串中,然后在’\n’后再存入’\0’
    在很多时候我们都不希望有这个换行符的出现 , 只能再写代码消去这个’\n’
    3). fgets()函数在连续输入多个字符串时(也不能算是fgets()函数的缺点) , 但有时也会给我们带来麻烦) , 例如:
    char str1[10];
    char str2[10];
    在输入str1时输入了超过9个的字符如 : abcdefghigklm\n
    这时我们会发现 , str2根本不需要我们重新在键盘输入 , 而是存入了 abcdefghijklm’\n’ 中的 jklm\n
    此时
    字符串str1是"abcdefghi"
    字符串str2是"jklm"
    这是因为输入str1的函数在读取标准输入流中的字符时读到 i 时读取完成 , 此时剩下的jklm\n还在缓存区静静地等待被读取
    此时fgets()在输入str2时直接读取了缓冲区的 jklm\n由于遇到了’\n’(或者读入了(n - 1)个字符)再存入’\0’,此时str2的输入已经完成 , 并不需要我们再次输入 .
    让我们举个例子来看一下这几个特点 :

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #define N 10
    #include<string.h>
    void main() {
    	char str[N];
    	char str1[N];
    	char str2[N];
    	printf("请输入字符串str\n");
    	fgets(str, N, stdin);
    	printf("请输入字符串str1\n");
    	fgets(str1, N, stdin);
    	printf("请输入字符串str2\n");
    	fgets(str2, N, stdin);
    	printf("str为:\n%s\n", str);
    	printf("str1为:\n%s\n", str1);
    	printf("str2为:\n%s\n", str2);
    	system("pause");
    }
    

    运行时并未像scanf()那样出现越界问题导致程序异常终止的情况 , 但也输出了我们不想看到的 ‘\n’ , str2也并不是从我们再次输入的 , 而是从缓存区直接读取的
    在这里插入图片描述

    4. 我们也可以利用输入单个字符的函数与循环来输入一个字符串

    举个例子 , 如以下代码 :

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #define N 10
    void main() {
    	char str1[N];
    	printf("请输入字符串str1\n");
    	for (int i = 0, ch;; ++i) {
    		ch = getchar();
    		if (i == N - 1 || ch == '\n') {
    			str1[i] = '\0';
    			break;
    		}
    		str1[i] = ch;
    	}
    	printf("str1为:\n%s\n", str1);
    	system("pause");
    }
    

    可以看出输入也可以不越界
    在这里插入图片描述
    而且也不会像fgets()函数一样输入的字符串小于数组长度(n - 1)时有换行符 ‘\n’ 的问题
    在这里插入图片描述
    当然 , 循环形式和输入字符的函数还有其他, 例如, 用scanf("%c",ch) 也可以 , 这里就不一 一 举例 .

    总之 , 对库函数不满意的话 , 自己也可以写一个符合自己要求的函数或代码来实现 .

    例如 :

    #include<stdio.h>
    #include<stdlib.h>
    #define N 10
    void fun(char* str) {
    	for (int i = 0, ch = '\0'; ch != '\n'; ++i) {
    		ch = getchar();
    		if (i >= N) {//当超出字符串长度时, 继续接受键盘输入的字符,直到输入\n为止
    			//这是为了防止字符串输入完成后输入的字符会被下一个需要输入的数据接收
    			continue;
    		}
    		if (ch == '\n' || i == N - 1) {
    			str[i] = '\0';
    			continue;
    		}
    		str[i] = ch;
    	}
    }
    void main() {
    	char str[N];
    	char str1[N];
    	char str2[N];
    	printf("请输入字符串str\n");
    	fun(str);
    	printf("请输入字符串str1\n");
    	fun(str1);
    	printf("请输入字符串str2\n");
    	fun(str2);
    	printf("str为:\n%s\n", str);
    	printf("str1为:\n%s\n", str1);
    	printf("str2为:\n%s\n", str2);
    	system("pause");
    }
    

    如图, 即可以输入空格, 也不会越界 , 也没有从缓存区读取字符存入字符数组的问题
    这里是引用

    小结 :

    在C语言中输入一个字符串时应该根据实际情况 , 灵活运用输入方法 , 并不是有缺点就不能用 .
    展开全文
  • 关于“c语言键盘输入字符串到指针数组”的问题

    千次阅读 多人点赞 2017-12-04 22:47:03
    关于“c语言键盘输入字符串到指针数组”的问题今天敲了一段代码,遇到了从键盘输入多个字符串到指针数组的问题,在程序执行的时候出现了段错误的提示。本文主要涉及到了以下知识: 数据的存储 数组和指针 1.字符串...

    今天敲了一段代码,遇到了从键盘输入多个字符串到指针数组的问题,在程序执行的时候出现了段错误的提示。本文主要涉及到了以下知识:


    • 数据的存储
    • 数组和指针

    1.字符串常量的存储

    c语言中字符串常量存储在静态数据区,并且有字符串结束符,直到程序运行结束它才会被销毁,所以在程序中我们把一个字符串常量赋值给一个字符指针,如:

    char *pChar = "Hello World!";

    其中,”Hello World!”是一个字符串常量,pChar是一个字符指针。该句相当于将字符’H’在静态数据区中的地址赋给pChar。此时,字符串常量”Hello World!”只有一份存储在静态数据区。

    另外一种常见的类型是将一个字符串常量赋值给一个字符数组,而其余上面的指针形式有本质上的区别,如下:

    char str[] = "Hello World!";

    其中,”Hello World!”是一个字符串常量,str是一个字符数组。此时,程序会将字符串常量”Hello World!”拷贝一份到栈区(如果str是局部变量),从此将于字符串常量”Hello World!”再无联系。

    2.从键盘输入字符串

    从上面可以看出,我们可以给一个字符指针赋一个字符串常量,因为字符串常量在内存中真实存在且有其地址。而从键盘输入则不然,我们必须先分配一些空间用来存储键盘输入的字符串,例如:

    char* str = (char*)malloc(sizeof(char) * 100);
    scanf("%s", str);

    这样我们输入的字符串就会存储在str所指向的动态空间内。对指针数组的赋值参考以上即可。

    展开全文
  • #include <stdio.h> #include <stdlib.h> void test01() { char buf[10] = {}; //定义字符数组 int i,n; //初始化变量 i=n=0;... printf("请输入一个字符串:"); fgets(buf,size
  • C语言输入字符字符串

    千次阅读 2019-04-14 15:53:11
    1.C语言输入字符字符串 C语言有多个函数可以从键盘获得用户输入,它们分别是: scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。 getchar()、getche()、getch():这三个函数都用于输入单个字符。...
  • #include<stdio.h> #include<string.h> int main(){ char str[100];... printf("请输入一个字符串:"); gets(str); if((fp=fopen("test.txt","w"))==NULL){ printf("error!"); exit(0); ...
  • 除了在定义字符数组时初始化外,还可以通过scanf从键盘输入字符串。下面写一个程序: # include <stdio.h> int main(void) { char str[10]; //str是string的缩写, 即字符串 printf(“请输入字符串:”); scanf...
  • C语言键盘输入5个整数,删除所需索引的元素,输入删除后的剩余的数组元素,然后继续删除所需索引的元素,直到所有的元素值为0,程序结束。 例如  输入:8 4 6 1 2  ...
  • #include<stdio.h> int main(){ FILE *fp; char s[50]; int i; if((fp=fopen("test1.dat","w"))==NULL){ printf("error!... printf("请输入字符串:"); gets(s); fprintf(fp,"%s",s); fclose...
  • 键盘输入两个字符串str1和str2,使用指针分别指向两个字符串。比较str1和str2的大小,不使用字符串比较函数。字符比较时使用指针取内容表示。若str1=str2,输出:0;若str1&amp;amp;gt;str2,输出:1;若str1&...
  • 问题描述:从键盘输入两个字符串,输入两个字符串连接的结果 例:从键盘输入 abc def 输出 abcdef 代码如下: #include <stdio.h> #define N 100 char *my_strcat(char *dest,char *src); int main() { char ...
  • 1. 从键盘输入单字符(不管输入多少个字符,只接受第一个字符) ...2. 从键盘输入一串字符,只接受空格前的字符串 #include <stdio.h> int main() { printf("请输入一串字符"); char .
  • C语言 字符与字符串

    2018-03-18 23:33:42
    getchar ():能从键盘读入一个字符,并且作为返回值返回。但是返回值汇编自动强制转化成整型(int)。用户可以用这个返回值与EOF(END OF FILE,文件结束标志,整型的)比较。比如 c=getchar();使用printf("%c...
  • C语言中的字符串

    2015-05-08 20:52:00
    1.字符串输入和输出:  在C语言中是没有标示字符串的关键字的,C语言中用字符数组表示字符串  如果要输出字符串 那么使用 %s 来进行... 同样用%s接收键盘输入的一个字符串  例: scanf("%s",str); scanf("%s...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,086
精华内容 434
关键字:

c语言键盘输入字符串

c语言 订阅