#include
#include
#include
char *unescape(char s[], char t[]);
char *escape(char s[], char t[]);
int main()
{
char *s = (char*)malloc(sizeof(100)); /*修改处 vc6.0 中 该语句不能放在scanf()语句之后*/
char t[80];
scanf("%s", t);
printf("%s",t);
//char *t = "a\tbelkdjl\td\n"; // 为什么这样定义 可以啊?
//printf("%s\n",t);
printf("%s\n", escape(s, t)); // 调用escape()输出有问题。
return 0;
}
/*escape : expand newline and tab into visible sequences while copying the string t to s */
char *escape(char s[], char t[])
{
int i, j;
for(i = j = 0; t[i] != '\0'; ++i)
switch(t[i])
{
case '\n': //想输出\n需要两个char来存储,也就是'\\', 'n'
s[j++] = '\\';
s[j++] = 'n';
break;
case '\t':
s[j++] = '\\';
s[j++] = 't';
break;
default:
s[j++] = t[i];
break;
}
s[j] = '\0';
return s;
}
这里有个问题 让我困扰的很久。
1.如果用scanf()函数来输入字符串t,输入a b(空格代表制表符),输出a。
后来查了下c plus primer 才知道scanf()在开始读取输入以后,会在遇到的第一个空白字符空格(blank)、制表符(tab)或换行符(newline)处停止读取。因此,在遇到空白字符停止了扫描。一般情况下,使用%s的scanf()只会把一个单词而不是把整个语句作为字符串读入。这里空白字符包括制表符、空格、换行符。(书上原话)
但是在用"%c"输入时,空格和“转义字符”均作为有效字符。不知道为什么?
这里补充了知识:
scanf遇到以下情况结束读入
1.white chars 空格,回车,制表符
2.到达%m[d/f/c/s/e/u]指定的宽度m
3.出现非法字符,对于%d来说,非digit就是非法字符,如:'a'
要使字符串读入white chars,C中使用gets,gets是专门处理字符串读入的函数,没有跳white chars的限制;C++中使用cin.get或者cin.getline
2.能不能scanf()函数接收空白字符?除了gets( )和fgets( )函数。 答案:能
以下是专业回复。
问题二:scanf()函数不能正确接受有空格的字符串?如: I love you!
#include
int main()
{
char str[80];
scanf("%s",str);
printf("%s",str);
return 0;
}
#include
int main()
{
char str[80];
char str1[80];
char str2[80];
scanf("%s",str);/*此处输入:I love you! */
printf("%s",str);
sleep(5);/*这里等待5秒,告诉你程序运行到什么地方*/
scanf("%s",str1);/*这两句无需你再输入,是对键盘盘缓冲区再扫描 */
scanf("%s",str2);/*这两句无需你再输入,是对键盘盘缓冲区再扫描 */
printf("\n%s",str1);
printf("\n%s",str2);
return 0;
}
#include "stdio.h"
int main()
{
char string[50];
/*scanf("%s",string);不能接收空格符*/
scanf("%[^\n]",string);
printf("%s\n",string);
return 0;
}
3. 还有就是
//char *t = "a\tbelkdjl\td\n"; // 为什么这样定义 可以啊?
//printf("%s\n",t);
遇到字符串中的字符 '\' 会自动 将后面的字符转义么? 即 \t 表示为制表符?