通过scanf输入字符串VS2010环境下:#include stdafx.hint _tmain(int argc, _TCHAR* argv[]){char s[100]
通过scanf输入字符串
VS2010环境下:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
char s[100];
scanf("%s\n", s);
printf("%s", s);
system("pause");
return 0;
}
这样的话是可以的,但是一旦输入的字符串中带有空格,输出的话就从空格那个地方截断了。
但是如果代码改成这个样子:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
char *s = NULL;
scanf("%s\n", s);
printf("%s", s);
system("pause");
return 0;
}
或者
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
char *s = "";
scanf("%s\n", s);
printf("%s", s);
system("pause");
return 0;
}
后面这两种写法,程序在编译的时候是没有什么语法错误的,但是运行的时候,输入字符串,然后回车,就爆出异常了,不知道为什么?
[解决办法]正确的写法是这样的:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
char s[100];
//scanf("%s\n", s);
fgets(s, 99, stdin);
printf("%s", s);
system("pause");
return 0;
}
后两种爆出异常的原因是没有给s分配空间。
[解决办法]指针没有分配空间,越界了
修改下
int _tmain(int argc, _TCHAR* argv[])
{
char *s ;
s=(char *)malloc(100);
scanf("%s\n", s);
printf("%s", s);
system("pause");
return 0;
}
[解决办法]简单来说:
char *s = NULL;
scanf("%s\n", s);
企图写地址0,这个地址在进程的地址空间是被操作系统使用的,应用程序不得非法入侵.
char *s = "";
scanf("%s\n", s);
企图修改只读空间(""位于程序的只读空间).
[解决办法]scanf遇到enter、空格、非法字符,输入就结束
char *s = NULL;
scanf("%s\n", s);
NULL是0地址,内存空间的首地址,这个地址里面的值可能是操作系统有重要用途的数据,具体是什么我不大清楚,绝对不允许用户重新写入
char *s = "";
scanf("%s\n", s);
s是指向空字符串,在只读区域,只读区域也是不允许用户重新写入的。
总的来说,char *s,这里只是定义了一个指针变量,这个指针变量的地址是确定了,但是这个指针变量指向哪里是不确定的,可能是指针操作系统某个重要的数据区域,所以不能对他进行直接赋值。
char *pcStr;
char acStr[20];
pcStr = acStr;
这样是可以的,将pcStr指向acStr这个字符数组的首地址,接下来就可以用scanf("%s", pcStr);因为此时的pcStr指向用户自己定义的变量。
[解决办法]一楼准确的
fgets函数会以换行符为结束的,并且会保留改换行符一起输出的
gets函数则是相反了,虽然也是以换行符结束的,但是会丢弃掉换行符不输出
所以gets和puts共用
fgets和fputs共用是有原理的
[解决办法]其实fscanf,scanf,这类函数他把字符串放在那一个个读入,读到不匹配就会返回,但是要注意的是,%d,%s都会吸收前面的空格,但是%c不会。格式符号里面的空格可以吸收无穷多个空格,他们都以用户输入\n结束流,但是最后的\n还是可以给下一个scanf使用的。但是gets(a)却是以\n结尾,但是这个\n就被消耗了。
下面两个例子:
char ch,a[20];
fscanf(stdin,"%s",a);
fscanf(stdin,"%c",&ch);
用户输入空格\n空格\n然后abcdef\n这就结束了。这时a的字符串就是abcdef,前面的空格\n空格\n被吸收了。如果是%d同样也会吸收。然后他读到abcdef\n,发现\n结束流,然后匹配到\n,把\n留下,%c读到\n马上结束。
char ch,a[20];
gets(a);
fscanf(stdin,"%c",&ch);
但对于这个你输入abcdefg\n他是不会结束的,因为\n被消耗掉,所以你输入\n\n这种就会结束,
这时赋给a的就是a[0]='\0',给c的却是10(\n)。
[解决办法]没有空间放你输入的字符串
[解决办法]此正解!