读书人

经过scanf输入字符串

发布时间: 2013-10-17 17:26:17 作者: rapoo

通过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分配空间。
[解决办法]
引用:
VS2010环境下:

C/C++ code?12345678910111213#include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]){ char s[100]; scanf("%s\n", s); printf("%s", s); system("pause"); retur……

指针没有分配空间,越界了
修改下

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)。
[解决办法]
引用:
VS2010环境下:



C/C++ code?



12345678910111213

#include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { char s[100]; scanf("%s\n", s); printf("%s", s); system("pause……


没有空间放你输入的字符串
[解决办法]
引用:
简单来说:

char *s = NULL;
scanf("%s\n", s);
企图写地址0,这个地址在进程的地址空间是被操作系统使用的,应用程序不得非法入侵.



char *s = "";
scanf("%s\n", s);
企图修改只读空间(""位于程序的只读空间).



此正解!

读书人网 >C语言

热点推荐