C语言输入输出字符串

char ch[5];
scanf("%s",ch);
printf("%s",ch);
我在学习视频中看到这么一句话用来输入输出一个字符串。按我的理解ch[5]的作用是把字符串的长度限定在5个字节里,但是实际操作发现我的字符串无论输入的多长多短,都是输入的什么输出的就是什么。但是当我把5去掉,变成char ch;或者char ch[];都会出错无法运行。改成1的话,也还是输入的什么输出的就是什么。所以求问这个5,或者说数字到底有什么用。如果我想要限定输出字符串的长度,应该怎么操作。

char ch[5]表示的是定义了一个字符数组(即字符串),数组单元有5个,每个单元都是字符型,由于字符串是用\0作结束的,5个单元的字符数组实际上能完整存储的只能是长度不超过4个字符的字符串,多了的话就要占用其他单元了(这些单元有可能会被系统分配给其他变量,而能够用来存储字符串的就是你定义的这5个单元的字符数组),可能会出现溢出,也就是有时候会出现输出的字符串后面有乱码
char ch表示定义了一个字符变量,用scanf为其赋值的话应该用%c,即scanf("%c",&ch),它只能表示一个字符
char ch[]数组定义不允许[]里为空
char ch[1]表示的也是一个字符数组,所以你可以输入字符串,同样随便输入就有可能溢出追问

我试了试溢出范围,根据我的测试,字节数最多到28,超过28运行就会崩溃,为什么是28?

追答

给你设计了个程序便于更好的理解这个问题:

#include <stdio.h>
int main()
{
int a[10];//定义一个整型数组 
char ch[5];//定义一个字符串 
int i;//定义一个循环变量 
printf("字符串ch的起始地址=%d\n\n",ch);//输出字符串ch的起始地址 
printf("整型数组a的起始地址=%d\n\n",a);//输出整型数组a的起始地址 
printf("请输入字符串ch=");
scanf("%s",ch);//输入字符串 
for(i=0;i<10;i++)//通过一个循环自动为整型数组a赋值为0 1 2 3 4 5 6 7 8 9 
a[i]=i;
printf("输入的字符串ch=%s\n\n",ch);//输出字符串ch
printf("数组a的值为="); 
for(i=0;i<10;i++)//通过一个循环输出整型数组a的值 
printf("%4d",a[i]);
printf("\n\n");
return 0;
}

程序的运行结果:

这里系统为一个数组最短分配了16个字节的空间,但这是不一定的,不同系统可能是不同的,你说的28这也是不确定的,这需要看操作系统对内存管理的策略了,因此在编程的时候尽量不要出现数组溢出的情况,否则会导致程序的输出不确定或是错误的情况

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-10
在C语言中,输入输出有以下两种方式:
1 用scanf/printf输入输出。
scanf/printf是C语言的格式化输入输出函数,可以用于输入输出各种基础类型,字符串(char*)也在其支持范围内。
格式化字符为%s。
定义
char str[100];
输入
scanf("%s",str);
输出
printf("%s",str);

2 C语言还支持专门的字符串输入输出函数:gets/puts。
gets的作用为,读入一行输入,并将读到的替换为字符串结束符。
puts的作用为,将字符串单行输出,即输出字符串内容后,会自动在结尾增加换行。
定义
char str[100];
输入
gets(str);
输出
puts(str);本回答被网友采纳
第2个回答  2014-06-27
解答:
ch [5}是说你已经声明了五个字符数组,你说的输入什么后又输出什么,是因为你都储存在地址为ch[0]即第一个字符数组里面。
你声明char ch;char ch[],只是申明数组的名字,比没有数组的大小,所以计算机无法执行,就像你申请一个人户口,你只告诉别人名字,不告诉别人你申请人性别,别人依然不会为你办户口一样。呵呵,一个比方啦。
如果你要限制字符串的长度,大可以每个数组里储存一个字符,这样就可以控制啦。
谢谢,希望能帮到你啦!
第3个回答  2014-06-27
puts()和gets()都是数组函数,输入或输出前要定义数组
例如:
char a[50];
gets(a);
puts(a);
就是一个简单的输入后再将输入的东西输出,puts()的输入和printf的输出是有一定的区别的,puts()遇到‘\0'就终止,而用printf则不会这样。
例如:
char a[50];
gets(a);
puts(a);
printf("%s",a);
如果正好输入50个字符,则两次输出一致。但如果输入字符不足50个,puts()输出输入的全部字符,而没有输入的不输出,而printf则不能识别'\0',所以会出现乱码。
第4个回答  2014-06-27
首先,你的理解没有错,char就是一个字符的声明方式.ch[5]就是5个字符.
其次char ch这种声明是没错的.
唯一有问题的是sanf以及printf中的格式字符,如果是char应该用%c.而且如果在程序内部赋值的话,字符串要用""括起,而字符只能用''括起.
这种定义和C++是不一样的,C++完全允许char ch[]这种声明方式的.

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网