鱼C论坛

 找回密码
 立即注册
查看: 2326|回复: 10

[已解决]scanf函数和字符指针的小疑问...

[复制链接]
发表于 2018-11-14 14:11:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
                char *str;
               
                printf("请输入:");
                scanf("%s", &str);
               
                printf("%s", str);
               
                return 0;
}

这样写的话不行,想问问各位大佬详细的原因!!!感谢大家
最佳答案
2018-11-15 11:33:15
本帖最后由 风扫地 于 2018-11-15 11:56 编辑

应该这么解释:
char *str;
没有初始化,也没有指向你可以用的空间。
str没被初始化,你存哪里去了你知道不?

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
char* str = "123456\0";  //定义指针并初始化
这个意思是 内存里面已经有了 123456\0  这样的字符串(怎么有的不要你管),用str指向他(就是把他的首地址值赋值给str);
///////////////////////////////////////////////////////////////////////////////////////////////////////////
char a[20];
char *str = a;

scanf("%s",str);
这表示把你输入的数据存入到str指向的空间,而不是让str指向你输入数据存放的空间。你输入的数据会先存入某个缓存中(都存某个地方让你来指,系统得开多少内存让你存你输入的东西),再存入到str指向的空间。
再者说:scanf传入的是str这个指针变量的值,不是str这个指针变量的址,scanf函数也没办法改变str的指向。


体会一下他们的区别。

指针不初始化就对他指向的空间瞎写,胆子不小。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-14 21:26:39 | 显示全部楼层
char *str是字符串常量,修改(这里是输入)当然会出错。你要改成:
#include<stdio.h>
#include<string>    //建议设置成string
using namespace std;  //你还少打了这里
int main(void)
{
    string str;
    printf("请输入:");
    scanf("%s", &str);                
    printf("%s", str);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-15 09:26:09 | 显示全部楼层
TCY 发表于 2018-11-14 21:26
char *str是字符串常量,修改(这里是输入)当然会出错。你要改成:

我的意思是程序是能走起来,但是就是不能打印出结果。就是想问问scanf函数不是接收的是字符串嘛,字符串存储的话不就是一串连续的地址,然后通过首地址找到这个字符串。然后的话 str 是一个字符类型的指针变量,本来就是用来存放变量的,把字符串的首地址给它有什么不对呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-15 09:27:32 | 显示全部楼层
TCY 发表于 2018-11-14 21:26
char *str是字符串常量,修改(这里是输入)当然会出错。你要改成:

还有就是你说的第一句话 是字符串常量那一句我有点没理解,还望详细解答下!非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-15 11:33:15 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风扫地 于 2018-11-15 11:56 编辑

应该这么解释:
char *str;
没有初始化,也没有指向你可以用的空间。
str没被初始化,你存哪里去了你知道不?

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
char* str = "123456\0";  //定义指针并初始化
这个意思是 内存里面已经有了 123456\0  这样的字符串(怎么有的不要你管),用str指向他(就是把他的首地址值赋值给str);
///////////////////////////////////////////////////////////////////////////////////////////////////////////
char a[20];
char *str = a;

scanf("%s",str);
这表示把你输入的数据存入到str指向的空间,而不是让str指向你输入数据存放的空间。你输入的数据会先存入某个缓存中(都存某个地方让你来指,系统得开多少内存让你存你输入的东西),再存入到str指向的空间。
再者说:scanf传入的是str这个指针变量的值,不是str这个指针变量的址,scanf函数也没办法改变str的指向。


体会一下他们的区别。

指针不初始化就对他指向的空间瞎写,胆子不小。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-15 15:42:06 | 显示全部楼层
最重要的还是,指针未初始化,然后 你的程序运行到你的指针的时候,指针就会随机初始化一个地址垃圾值吧,此时你也不知道 这个地址上的值是什么,你就乱来,是不行的

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
啊涂涂 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-16 09:59:22 | 显示全部楼层
那兄弟,麻烦再问一下,我用malloc把空间给开辟出来了,再往里面存为什么也不行呢?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        char *str = NULL;

         str = (char *)malloc(128);

         scanf("%s", &str);

        printf("%s", str);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-16 10:01:38 | 显示全部楼层
风扫地 发表于 2018-11-15 11:33
应该这么解释:
char *str;
没有初始化,也没有指向你可以用的空间。

  楼主| 发表于 34 秒前 | 只看该作者
那兄弟,麻烦再问一下,我用malloc把空间给开辟出来了,再往里面存为什么也不行呢?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        char *str = NULL;

         str = (char *)malloc(128);

         scanf("%s", &str);

        printf("%s", str);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-16 11:55:45 | 显示全部楼层
本帖最后由 风扫地 于 2018-11-16 11:59 编辑
啊涂涂 发表于 2018-11-16 10:01
楼主| 发表于 34 秒前 | 只看该作者
那兄弟,麻烦再问一下,我用malloc把空间给开辟出来了,再往里面 ...


可以。

1.要检测str(也就是malloc的返回值) 是不是NULL,如果是NULL就表示malloc没有成功,若此时写0地址也有问题;
2.用完了记得释放,不然会造成内存泄漏,有的运行环境有更高等级的堆内存自动回收机制,但一般来说只malloc而不free,调用次数越多,你可去malloc的堆内存将越来越少,直到堆内存枯竭。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
下面一段代码,你尝试修改N的值在getchar断下来,在windows的任务管理器里面看看内存占用有啥不一样。


#define N 1000
int test_main(void);
int main(void)
{
   for(int i = 0;i<N;i++)
  {
     test_main();
  }
  getchar(); //
  return 0;
}


int test_main(void)
{
        char *str = NULL;

         str = (char *)malloc(128);

         scanf("%s", &str);

        printf("%s", str);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-16 12:59:43 | 显示全部楼层
本帖最后由 啊涂涂 于 2018-11-16 13:02 编辑
风扫地 发表于 2018-11-16 11:55
可以。

1.要检测str(也就是malloc的返回值) 是不是NULL,如果是NULL就表示malloc没有成功,若此 ...


我就按照我写的那个一模一样,然后输入 I Love FishC.com! 结果还是没反应是为什么呀,就打出来了一个问号......而且兄弟你下面写这个程序我没看懂,我才刚学到单链表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-16 13:34:41 | 显示全部楼层
啊涂涂 发表于 2018-11-16 12:59
我就按照我写的那个一模一样,然后输入 I Love FishC.com! 结果还是没反应是为什么呀,就打出来了一个 ...

申请以后还要清零空间。
memset(str,0,128)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 18:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表