啊涂涂 发表于 2018-11-14 14:11:42

scanf函数和字符指针的小疑问...

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

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

这样写的话不行,想问问各位大佬详细的原因!!!感谢大家

TCY 发表于 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;
}

啊涂涂 发表于 2018-11-15 09:26:09

TCY 发表于 2018-11-14 21:26
char *str是字符串常量,修改(这里是输入)当然会出错。你要改成:

我的意思是程序是能走起来,但是就是不能打印出结果。就是想问问scanf函数不是接收的是字符串嘛,字符串存储的话不就是一串连续的地址,然后通过首地址找到这个字符串。然后的话 str 是一个字符类型的指针变量,本来就是用来存放变量的,把字符串的首地址给它有什么不对呢?

啊涂涂 发表于 2018-11-15 09:27:32

TCY 发表于 2018-11-14 21:26
char *str是字符串常量,修改(这里是输入)当然会出错。你要改成:

还有就是你说的第一句话 是字符串常量那一句我有点没理解,还望详细解答下!非常感谢

风扫地 发表于 2018-11-15 11:33:15

本帖最后由 风扫地 于 2018-11-15 11:56 编辑

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

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

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


体会一下他们的区别。

指针不初始化就对他指向的空间瞎写,胆子不小。

当打野会编程 发表于 2018-11-15 15:42:06

最重要的还是,指针未初始化,然后 你的程序运行到你的指针的时候,指针就会随机初始化一个地址垃圾值吧,此时你也不知道 这个地址上的值是什么,你就乱来,是不行的

啊涂涂 发表于 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;
}

啊涂涂 发表于 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;
}

风扫地 发表于 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;
}

啊涂涂 发表于 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! 结果还是没反应是为什么呀,就打出来了一个问号......而且兄弟你下面写这个程序我没看懂,我才刚学到单链表{:10_266:}

风扫地 发表于 2018-11-16 13:34:41

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

申请以后还要清零空间。
memset(str,0,128)
页: [1]
查看完整版本: scanf函数和字符指针的小疑问...