输入字符串到指针

wangmm2008 2011-09-18 10:56:30
#include <stdio.h>
#include <string.h>
void main(){
char *str;
printf("input:\n");
scanf("%s",str);
printf("%s",str);
}
上述用法我自己感觉有问题,但是又能正常运行,只不过输入字符串长度不能超过11个,否则会段错误
我用的是gcc

谁能解释一下?
...全文
371 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
辰岡墨竹 2011-09-18
  • 打赏
  • 举报
回复
你可以用fgets读取stdin输入字符串,因为fgets是可以指定一次读取多少个字节的,你可以先设定1024个字节,如果没有读够的话,最后一个字节会是'\0'。
你可以用i = strlen(str) - 1;然后判断str[i]是不是‘\n’,如果不是,说明没读到回车。
可以realloc分配更多空间,再fgets读一次stdin,注意这时传入的指针要指向str[i+1],就能接在一起了。

不过一般来说超过100位的十进制整数是很少用的吧,所以一般一次256个字节的缓冲区就足够了。
东莞某某某 2011-09-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wangmm2008 的回复:]

引用 3 楼 gdujian0119 的回复:
str没分配内存,你那样输入之后str应该指向了栈,这个11可能会变的,因为到那可能正好越界。
楼主应该改为:

C/C++ code
#include <stdio.h>
#include <string.h>
void main(){
char str[1024];
printf("input:\n");
scanf("%s……
[/Quote]


可以使用C++ 容器,不能用了可以学习他们的分配策略,譬如你可以先分配100BYTE,如果还需要再重新分配
wangmm2008 2011-09-18
  • 打赏
  • 举报
回复
要读入这个长度未定的字符串,可能很长,远超过申请的数组大小,如果不用数组,还可怎么处理
大家遇到这种情况怎么处理的?
querdaizhi 2011-09-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kuyucman 的回复:]

那是编译器的行为吧 这代码肯定不行

char *str;改为 char数组 或者 malloc内存吧
[/Quote]


嘿嘿,好多这样的帖子啊,都是用指针不分配内存的.....
wangmm2008 2011-09-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gdujian0119 的回复:]
str没分配内存,你那样输入之后str应该指向了栈,这个11可能会变的,因为到那可能正好越界。
楼主应该改为:

C/C++ code
#include <stdio.h>
#include <string.h>
void main(){
char str[1024];
printf("input:\n");
scanf("%s",str);
p……
[/Quote]

如果我要输入两个大数,位数不确定,可能会大于1024位(输入时当做字符串),咋处理?
wangmm2008 2011-09-18
  • 打赏
  • 举报
回复
我用了gdb调试,str定义后就指向了一个地址,scanf读取后str指向的地址不变,但是str却是已经读入了输入的字符串
我试了好几次,每次str指向的地址都不一样,但是都能顺利读入字符串只不过每次都是最多读入11个字符长度,多于11个调试结束时就出现段错误
hu7324829 2011-09-18
  • 打赏
  • 举报
回复
str没有分配内存,不可读.
编译不报错,也应该有警告啊
孤独小剑 2011-09-18
  • 打赏
  • 举报
回复
str没分配内存,你那样输入之后str应该指向了栈,这个11可能会变的,因为到那可能正好越界。
楼主应该改为:
#include <stdio.h>
#include <string.h>
void main(){
char str[1024];
printf("input:\n");
scanf("%s",str);
printf("%s",str);
}

或者
#include <stdio.h>
#include <string.h>
void main(){
char *str;
str = (char *)malloc(1024);
printf("input:\n");
scanf("%s",str);
printf("%s",str);
free(str);
str = NULL;
}

这样就可以了。
xwfde 2011-09-18
  • 打赏
  • 举报
回复
char *str;
后。str的值是一个随机数字,意思即指针指向一个随机内存地址。
之后的赋值,即往那个随机地址复制东西,那个地址由于是随机的,通常是不可写的地区,你能复制11个字符已经很幸运了
东莞某某某 2011-09-18
  • 打赏
  • 举报
回复
那是编译器的行为吧 这代码肯定不行

char *str;改为 char数组 或者 malloc内存吧
贝隆 2011-09-18
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>
void main()
{
char * str;
char strArray[256];
str=strArray;
printf("input:\n");
scanf("%s",str);
printf("%s",str);
}

69,371

社区成员

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

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