c语言printf 字符串输出字符串

C语言字符串输出
在采用字符串方式后,字符数组的输入输出将变得简单方便。除了上述用字符串赋初值的办法外,还可用scanf函数和printf函数一次性输入输出一个字符数组中的字符串,而不必使用循环语句逐个输入输出每个字符。
要输出一个字符串需要在printf函数的格式描述串中使用转换字符串“%s”,表示输出的是一个字符串。如:
char name[]="Hello world";
printf("%s\n",name);
在printf语句中使用了转换字符串“%s”,因此输出参数中只给出数组名即可。同样,要输入一个字符串也要加转换字符串“%s”。如:
char name[15];
printf("请输入姓名:\n");
scanf("%s",name);
printf("%s",name);
由于定义数组name的长度为15,因此输入的字符串长度必须小于15,以留出1字节用于存放字符串结束标示'\0'。对一个字符数组,如果不作初始化赋值,则必须说明数组长度。然而,scanf()语句在按下回车键前都将接收字符。按下回车键后,scanf()在字符串末尾插入一个空字符'\0'以标示字符串结束。因此,如果键入25个字符后再按下回车键,尽管字符串声明为仅由15个字符构成,它仍将接收并存储字符。因此,对字符串使用scanf()时,必须注意输入字符串长度不能超过声明字符串时指定的大小。这是因为输入多余字符后,编译器也不会发出任何错误提示或警告,这些字符甚至被接收并存储在内存中,造成程序隐患。scanf()语句不允许在输入中存在空白字符。例如,当用scanf()接收字符串时,键入“Liu
Hua"后,只有“Liu”被存储在内存中,而空格字符后的其他剩余字符将被丢弃。要克服这个问题,C语言中提供了gets()和puts()函数,分别用于字符串的输入和输出。
puts函数的格式为:
puts (字符数组名);
功能:把字符数组中的字符串输出到显示器。即在屏幕上显示该字符串。
gets函数的格式为:
gets (字符数组名);
功能:从标准输入键盘上读入一个完整的行(从标准输入读,一直读到遇到换行符),把读到的内容存入括号中指定的字符数组里。并用空字符'\0'取代行尾的换行符'\n'。gets()函数允许在字符串中间包含空格。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。收藏,2.6k 浏览
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
#include"stdio.h"
#include "stdlib.h"
int main(void)
scanf("%d\n",&width);
word=(char*)malloc(width*sizeof(char));
for(i=0;i&i++){
scanf("%c",&word[i]);
m=word[0];
for(i=0;i&i++)
if(word[i]&m){
m=word[i];
for(i=0;i&i++){
printf("%c",word[i]);
printf("(max)");
当我输入“3(另起一行) abc”时结果为abc(max)。而当我令a[5]="(abc)"并将printf("(max)")换为puts(a)时,为什么输出为abc(max)c?谢谢回答。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
不用细看代码就知道。字符串以'\0'结尾,你5个字符,分配的大小是长度为5的char数组吧?
所以不是puts、printf的问题,是你放字符串的数组中没有NULL!所以它就继续打印出栈中的其它局部变量的值,直到遇到NULL。
你代码中没有char a[5]的声明,我猜顺序也刚好在char m前面。
char a[6]="(max)" 或为什么不直接写 char *a="(max)" ?
还有,Linux仔仔们可能玩不出楼主这种效果来。不知道楼主用的什么编译器。
因为GCC能检查出这类字符串分配空间的问题,启用stack protector,在char a[5]后面放个canary,这个值最低位字节通常是NULL,所以保证了字符串以NULL结尾,puts输出就不会异常。
同步到新浪微博
分享到微博?
与我们一起探索更多的未知
专业的开发者技术社区,为用户提供多样化的线上知识交流,丰富的线下活动及给力的工作机会
加入只需一步
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
举报理由:
推广(招聘、广告、SEO 等)方面的内容
带有人身攻击、辱骂、仇恨等违反条款的内容
与已有问题重复(请编辑该提问指向已有相同问题)
不友善内容
答非所问,不符合答题要求
其他原因(请补充说明)
补充说明:
扫扫下载 App
SegmentFault
一起探索更多未知C语言真扯蛋了,控制台输出Unicode中文的方法
char* paName =
wchar_t* pwName = L"测试中";
printf(paName); //输出为:测试中
wprintf((wchar_t*)paName); //输出为:空
printf((char*)pwName); //输出为:乱码
wprintf(pwName); //输出为:空
如果将程序改写如下,则输出的结果就不一样了
#include &locale&
包含头文件先
char* paName =
wchar_t* pwName = L"测试中";
setlocale(LC_ALL, "chs");
printf(paName); //输出为:测试
wprintf((wchar_t*)paName); //输出为:空
printf((char*)pwName); //输出为:乱码
wprintf(pwName); //输出为:测试
从上面两个代码片断可以看出:setlocale()对printf()没有影响,同时对char*的字符串也没有影响。唯一受到影响的是wprintf()这个函数了。我通过调试器查看了paName和pwName的字符,他们分别是:
paName :b2e2 cad4 d6d0 …… 应该是CHS编码(也就是代码页936)
-------------------
以上是网上找到的解决方法
转自:/niuniu502/archive//1392636.html
3、printf和wprintf
  加上这两位C语言中的老兄,问题更加复杂。考虑如下语句(注意s的大小写):
   printf("%s", "multibyte中文\n"); // ④
   printf("%S", L"unicode中文\n"); // ⑤
   wprintf(L"%S", "multibyte中文\n"); // ⑥   wprintf(L"%s",
L"unicode中文\n"); // ⑦
  缺省情况下,⑤、⑦两条语句不能输出中文,这两条语句中字符串的形式是unicode形式的。如果在所有输出语句之前加上如下语句将C语言的全局locale设置为本地语言(C语言中只有全局locale)就可以正常输出了:
  setlocale(LC_CTYPE, ""); // ⑧
  但这会导致cout和wcout不能输出中文(汗,的确麻烦),将C语言的全局locale恢复后cout和wcout就正常了,如下所示:
  setlocale(LC_CTYPE, "C"); // ⑨
  但恢复后,printf和wprintf输出Unicode文本又不正常了(输出MultiByte文本总是正常的)。总不能每写一个
printf/wprintf就设置一次然后再恢复一次吧?所以,建议不要混用iostream和printf/wprintf,实在要混用,那就让
printf/wprintf只输出MultiByte字符串,这样不需要调用setlocale(),也就不会影响到cout和wcout。
  总之,用iostream、printf/wprintf输出中文,有点麻烦。概括起来要点如下:
如果要用wcout,需要在使用之前按语句①将其locale设置为本地语言;
如果要用ofstream或wofstream,要在打开文件之前按语句②将全局locale设为本地语言并保存初始的全局locale。然后在打开文件之后,按语句③将全局locale恢复为初始值;
不要混用iostream和printf/wprintf。如果要混用,只用printf/wprintf输出MultiByte字符串;
单独使用printf/wprintf时,如果要输出Unicode字符串,需要按语句⑧设置C语言的全局locale。如果只输出MultiByte字符串,则不需设置。
为什么 wprintf 无法打印中文?
大学时就遇到这个问题,觉得很奇怪,为什么明明 Windows NT 系列内核都是使用 Unicode
的,而且在中文系统下跑,怎么反而无法输出汉字?虽然那时候鼓浪听涛上有前辈给出了提示,但还是不明白怎么会有这么 BT 的
  最近看了《C99 规范》才明白了,原来这是“规范”规定的(C99 这样规定,C89 应该也有吧,谁证实一下?):
At program startup, the
equivalent ofsetlocale(LC_ALL,
"C");is executed.
  所以,setlocale(LC_CTYPE,
NULL); 会返回一个 "C"。
  常规的解决方法是在程序入口处加下面这句代码:
setlocale(LC_CTYPE,
  但这样写要是用户在繁体版系统下运行岂不是出问题了,枉费了 Unicode 的好处,我发现用下面两个更好:
TCHAR szACP[16];
wsprintf(szACP, _T(".%d"), GetACP());
_tsetlocale(LC_CTYPE, szACP);
setlocale(LC_CTYPE,
这个方案有待测试,谁帮我在英文版、繁体中文版上测一下?
  个人不太相信 CRT,不过也没办法,流行嘛……
函数作用:
  函数wsprintf()将一系列的字符和数值输入到缓冲区。
  输出缓冲区里的的值取决于格式说明符(即"%")。
  如果写入的是文字,此函数给写入的文字的末尾追加一个'\0'。
  函数的返回值是写入的长度,但不包括最后的'\0'。
  int wsprintf(
  LPTSTR lpOut, // 输出缓冲区,最大为1024字节
  LPCTSTR lpFmt, // 格式字符串
  ...) // 需输出的参数;
  ;多少个参数都可以的,最起码前两个必须有
  我们在接触C语言的时候还接触过一个sprintf()的函数,
  用法和wsprintf()基本一样,区别在于:
  wsprintf()包含在头文件windows.h中
  sprintf()包含在头文件stdio.h中。
  wsprintf 其实分为 wsprintfA 和 wsprintfW,前者对应 sprintf,后者对应
wsprintf。
  wsprintf 有 1024 字符限制,而且不支持浮点数。
  所以注意了,该函数不支持浮点数的输入输出
关于%s和%ls的区别
我搜到了一篇帖子(很伤感,我再此发现在CS领域,最靠的住的资料总是英文的),里面对各种格式转换符有详细的解释,愿意看原文的同学直接忽略本段文字.......
http://www-ccs.ucsd.edu/c/lib_prin.html
首先,%ls和%s的区别很简单,%ls意味着将对应的参数会被当作基于宽字符的字符串(wide chraracter string
)看待,而%s则意味着对应的参数会被当作普通字符串(multi-byte string)看待。
其次,不要因为上面一句话而错误的认为%s只用于printf,而%ls只用于wprintf 。实际上,(printf, wprintf)
和(%s,%ls)这两个元组之间是相互独立的,也就是说它们之间的四种组合都是可以的。
再次,printf用于byte stream,即输出流中的每个字符颤1 byte;而wprintf则用于wide
stream,输出流中的每个字符不止 1 byte。
说了一堆废话,还是结合实例来看看%ls和%s的区别吧
例子1 printf + %s + wstr
printf("%s ",wstr);
whodare@whodare:$ ./a.out -N
哈,这个郁闷的"-N"又一次出现!为什么会出现呢?让我来分析一下printf在执行时所完成的操作吧。
这里用了%s, printf
就会将对应的参数wstr视为普通字符串(尽管我们清楚他是个wcs而不是mbs);另一方面,我们已经看到了wstr[
]的内存布局,其前3 byte为 0x2d
,0x4e,0x00。我们都知道C中的字符串以'\0'为结束标志,因此printf只会处理wstr[
]中的前三个byte,而查一查ASCII表,0x2d对应字符'-',0x4e对应字符'N',所以我们会看到”-N"这个诡异的输出。
例子2 printf + %ls + wstr
printf("%ls ",wstr);
whodare@whodare:$ ./a.out
使用了%ls,printf会将对应的参数视为宽字符串(wcs),而printf又对应byte
stream,因此这里要对宽字符(wcs)进行转换,变成普通的字符串(mbs)。这里的转换是printf通过对每个宽字符隐式的调用wcrtomb
()这个标准库函数完成的。按么,wcrtomb()这个函数进行是按照什么规则进行转换的?这就是setlocale()的作用所在了,wcrtomb
会依据程序员设定的locale,将wcha_t中存放的码值,转换为相应的的多字节编码。
回到例子中,我的机器的locale为zh_CN.UTF-8,对应的编码为UTF-8,因此wstr[
]中存放的Unicode码值会转换为UTF-8编码的形式输出到标准输出流中,这样采用UTF-8编码的console就能正确识别受到的字节流并显示出"中文"
例子3 wprintf + %s +wstr (最初的代码!)
wprintf(L"%s ",wstr);
whodare@whodare:$ ./a.out -N
使用了%s,wprintf会将对应的参数视为普通字符串mbs,尽管我们还是很清楚它其实是个wcs。 wprintf 使用的是wide
stream,因此需要将所给的mbs参数转换为wcs再由wprintf完成输出;这个转换是由wprintf隐式的对mbs不断调用mbrtowc来完成,转换规则依然是和locale相关的。
我们知道wstr的内存布局为:
0x2d 0x4e 0x00 0x00 0x87
0x65 0x00 0x00
0x00 0x00 0x00 0x00
该"mbs"的转换结果为 L‘0x2d' + L '0x4e' + L '0x00'
,最终输出结果又是讨厌的"-N"
例子4 wprintf + %ls+ wstr
wprintf(L"%ls ",wstr);
whodare@whodare:$ ./a.out
使用了%ls,wprintf会将对应参数视为宽字符串wcs,这次终于没有搞错。因此wprintf会顺利的将给定的宽字符串写入标准输出流,最终正确显示"中文"
看完这4个例子,你对wprintf、printf和%ls 、%s的使用还有疑惑么?
1。要清楚%ls和%s的意义在于指明所期待的参数是何种字符串,而printf和wprintf的区别在于所使用的是不同类型的stream
2。貌似在linux下输出“中文"的正确方法是 wprintf( "%ls\n",L"中文")
,而引文中作者在Windows成功操作的wprintf("%s\n",
L"中文")在linux无法正确工作,至于为何wprintf这个标准库函数在两个系统下有不同表现,我是无心再向下深挖了,难道这又是VC一处不符合标准的地方?.......
3 。貌似还有一个%S,单独用于表示对应参数是宽字符串
谁能告诉我该问题的答案,不盛感激.......
1.http://blog.csdn.net/whitehack/archive//6113908.aspx
2.http://blog.csdn.net/dawei_sun/archive//3541351.aspx
3./umu618/blog/item/77f3dac8e6ac5f117f3e6f0e.html
4./view/849487.htm
5./content/08/17_2044833.shtml
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。c语言printf 字符数组名
[问题点数:40分,结帖人liujiyun1239]
c语言printf 字符数组名
[问题点数:40分,结帖人liujiyun1239]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 c语言如何输出字符串 的文章

 

随机推荐