首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

经过scanf输入字符串

2013-10-17 
通过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分配空间。
[解决办法]
引用:
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); 
企图修改只读空间(""位于程序的只读空间).



此正解!

热点排行