通过scanf输入字符串

didijiji 2012-11-16 08:19:32
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;
}


后面这两种写法,程序在编译的时候是没有什么语法错误的,但是运行的时候,输入字符串,然后回车,就爆出异常了,不知道为什么?
...全文
16536 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010248499 2013-10-16
  • 打赏
  • 举报
回复
空指针根本没有申请内存空间 所以出错
qin_zhu 2012-11-17
  • 打赏
  • 举报
回复
引用 1 楼 turingo 的回复:
正确的写法是这样的: C/C++ code? 1234567891011121314 #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { char s[100]; //scanf("%s\n", s); fgets(s, 99, stdin); prin……
引用 5 楼 xuchao1229 的回复:
一楼准确的 fgets函数会以换行符为结束的,并且会保留改换行符一起输出的 gets函数则是相反了,虽然也是以换行符结束的,但是会丢弃掉换行符不输出 所以gets和puts共用 fgets和fputs共用是有原理的
++
zhifachen 2012-11-17
  • 打赏
  • 举报
回复
引用 3 楼 JiMoKuangXiangQu 的回复:
简单来说: char *s = NULL; scanf("%s\n", s); 企图写地址0,这个地址在进程的地址空间是被操作系统使用的,应用程序不得非法入侵. char *s = ""; scanf("%s\n", s); 企图修改只读空间(""位于程序的只读空间).
此正解!
AnYidan 2012-11-17
  • 打赏
  • 举报
回复
引用 楼主 didijiji 的回复:
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……
没有空间放你输入的字符串
wanglu343280746 2012-11-17
  • 打赏
  • 举报
回复
后两种指针没分配空间上面的详细解释过了,第一个scanf("%s\n",s);去掉\n
oKanXue1 2012-11-17
  • 打赏
  • 举报
回复
其实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)。
14号选手 2012-11-16
  • 打赏
  • 举报
回复
一楼准确的 fgets函数会以换行符为结束的,并且会保留改换行符一起输出的 gets函数则是相反了,虽然也是以换行符结束的,但是会丢弃掉换行符不输出 所以gets和puts共用 fgets和fputs共用是有原理的
jiemo1123 2012-11-16
  • 打赏
  • 举报
回复
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指向用户自己定义的变量。
JiMoKuangXiangQu 2012-11-16
  • 打赏
  • 举报
回复
简单来说: char *s = NULL; scanf("%s\n", s); 企图写地址0,这个地址在进程的地址空间是被操作系统使用的,应用程序不得非法入侵. char *s = ""; scanf("%s\n", s); 企图修改只读空间(""位于程序的只读空间).
转角天边 2012-11-16
  • 打赏
  • 举报
回复
引用 楼主 didijiji 的回复:
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;
}
图灵狗 2012-11-16
  • 打赏
  • 举报
回复
正确的写法是这样的:

#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分配空间。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧