关于段错误的问题,求前辈解惑,非常感谢

chaobao008 2013-11-03 12:59:52
1.这段程序运行之后提示段错误,是什么意思?
我的本意是想输入一个 good 然后显示成功,如果输入别的字符则提示输入错误
要怎样才能得到这种效果?
2.还有一个问题,我本意是想用一个字符数组或者字符指针(字符串还不知道是个啥,如果能做到的话也可以)记录一串字符,相当于创建一个帐号,然后再运行这段代码,输入 good和储存的那串字符匹配,如果这串字符是一样的,那么就会提示成功,反之则失败。那么问题就是:
我要怎么记录那串字符,而且这串字符是随机的不知道有多长,如果是用字符数组的话,我该怎么设置循环的条件,使其输入完那串字符之后就立即停止循环?
我是刚开始学习C语言没两天的新手,这些问题或许看起来挺简单,但是我是真的想破头皮了,而且字符数组和指针那一块还不能完全理解,所以这两个问题希望能有前辈帮忙解答一下,非常感谢。

#include <stdio.h>

void main (){
char *zh="";
scanf("%c",zh);
if(zh = "good"){
printf("成功");
}
else{
printf("输入错误");
}
}
...全文
132 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiandingzhe 2013-11-03
  • 打赏
  • 举报
回复
可以用gdb调试错误,死了之后看死的时候的函数位置。自己找用法去……
chaobao008 2013-11-03
  • 打赏
  • 举报
回复
引用 6 楼 Adol1111 的回复:
这样说吧,在C++中,char *zh="";这个等价于const char *zh=""; 为什么等价,是因为要兼容老代码,但最好现在写成这样。如果你知道const什么意思的话,就应该知道,这样写zh是一个只读的指针。是不允许更改内容的。 如果你强行修改,就会造成非法的地址访问,也就是段错误。如果一定要使用指针,最好先用malloc动态分配下,或者用数组的形式。总之这样写不好,误人误己。 刚开始学的话,最好多了解下标准和好的编程习惯,不然习惯了以后想改就很麻烦了。 楼上写的代码都可以,不过你看仔细了,如果你输入的内容,超过分配的长度同样会出错。
#include <stdio.h>
 
int main (){
    char *zh=0;
    zh=(char *)malloc(sizeof(char)*20);//分配了20个空间
    scanf("%s",zh);//%s是输入字符串,%c是单个字符
    //scanf("%c",&zh); 这样用zh,应该是char类型,而不是char*
    if(strcmp(zh,"good")==0){ //字符串要用strcmp比较,=表示赋值,不一样。
                              //如果zh是刚才说的char类型,应该用zh=='g',和单个字符比较
            printf("成功");
    }
    else{
        printf("输入错误");
    }
    return 0;
}
非常感谢,我终于懂了```因为看的不是入门书籍,所以看起来生涩难懂,所以想多写写,觉得可能会更容易理解一点,不过这里终于是懂了,非常感谢
Adol1111 2013-11-03
  • 打赏
  • 举报
回复
写的有点问题,改下:
#include <stdio.h>
#include<string.h> //strcmp要string头文件
int main (){
    char *zh=0;
    zh=(char *)malloc(sizeof(char)*20);
    scanf("%s",zh);
    if(strcmp(zh,"good")==0){ 
            printf("成功");
    }
    else{
        printf("输入错误");
    }
    free(zh);//和malloc对应,有malloc就要有对应的free
    return 0;
}
chaobao008 2013-11-03
  • 打赏
  • 举报
回复
引用 4 楼 u012527966 的回复:
[quote=引用 2 楼 max_min_ 的回复:]

#include <stdio.h>
#include <string.h>

int main(void)
{
	char buf[10] = {0};
	if (scanf("%s", buf) == 1)
	{
		if(strcmp(buf,"good") == 0)
		{
			printf(" You are success!\n");
		}
		else 
		    printf("You are failed!\n");
	}
	
	return 0;
}
上面的例子参考下! 出现段错误是因为没有分配内存地址引起的!
这段代码我看明白了,但是关键是编译运行之后会出现同样的错误,段错误,核心已转储。求解,我检查了几遍真的没抄错。 还有strcmp这个函数是在string.h里面的吗?[/quote] 呃‵‵是我错了,忘记重新编译了
Adol1111 2013-11-03
  • 打赏
  • 举报
回复
这样说吧,在C++中,char *zh="";这个等价于const char *zh=""; 为什么等价,是因为要兼容老代码,但最好现在写成这样。如果你知道const什么意思的话,就应该知道,这样写zh是一个只读的指针。是不允许更改内容的。 如果你强行修改,就会造成非法的地址访问,也就是段错误。如果一定要使用指针,最好先用malloc动态分配下,或者用数组的形式。总之这样写不好,误人误己。 刚开始学的话,最好多了解下标准和好的编程习惯,不然习惯了以后想改就很麻烦了。 楼上写的代码都可以,不过你看仔细了,如果你输入的内容,超过分配的长度同样会出错。
#include <stdio.h>
 
int main (){
    char *zh=0;
    zh=(char *)malloc(sizeof(char)*20);//分配了20个空间
    scanf("%s",zh);//%s是输入字符串,%c是单个字符
    //scanf("%c",&zh); 这样用zh,应该是char类型,而不是char*
    if(strcmp(zh,"good")==0){ //字符串要用strcmp比较,=表示赋值,不一样。
                              //如果zh是刚才说的char类型,应该用zh=='g',和单个字符比较
            printf("成功");
    }
    else{
        printf("输入错误");
    }
    return 0;
}
chaobao008 2013-11-03
  • 打赏
  • 举报
回复
引用 1 楼 hnwyllmm 的回复:
void main (){ char *zh=""; // 存放数组需要内存,但是这个zh只是一个指针 scanf("%c",zh);// %c是输入一个字符,不是一个字符串,用%s if(zh = "good"){ 字符串比较用strcmp函数,‘=’是赋值不是比较 printf("成功"); } else{ printf("输入错误"); } } 楼主的C基础没有看到,建议再多看点基础,按照教程做几道基础的练习题,包括数组、字符串和指针
因为才刚刚开始接触C语言,基础确实不怎样,但是在看数组和指针的时候很多东西不能一下子理解,可不可以在我代码里错误的地方写出修改方案?因为就算知道问题在哪里可能我一下子真的修改不好,非常感谢!
chaobao008 2013-11-03
  • 打赏
  • 举报
回复
引用 2 楼 max_min_ 的回复:

#include <stdio.h>
#include <string.h>

int main(void)
{
	char buf[10] = {0};
	if (scanf("%s", buf) == 1)
	{
		if(strcmp(buf,"good") == 0)
		{
			printf(" You are success!\n");
		}
		else 
		    printf("You are failed!\n");
	}
	
	return 0;
}
上面的例子参考下! 出现段错误是因为没有分配内存地址引起的!
这段代码我看明白了,但是关键是编译运行之后会出现同样的错误,段错误,核心已转储。求解,我检查了几遍真的没抄错。 还有strcmp这个函数是在string.h里面的吗?
一根烂笔头 2013-11-03
  • 打赏
  • 举报
回复
非法访问内存,会出现段错误! 1.

char *zh="";//zh只是一个指针,而且这里又指向一个空字符串,空字符串是个数值常量,后文不能修改,你却尝试修改了
//如果作为存储字符,必须使用数组或者动态分配
char zh[32]="";
or
char *zh = malloc(32);
2.采集字符串,使用的控制符是scanf("%s", zh);c是采集单个字符
max_min_ 2013-11-03
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>

int main(void)
{
	char buf[10] = {0};
	if (scanf("%s", buf) == 1)
	{
		if(strcmp(buf,"good") == 0)
		{
			printf(" You are success!\n");
		}
		else 
		    printf("You are failed!\n");
	}
	
	return 0;
}
上面的例子参考下! 出现段错误是因为没有分配内存地址引起的!
羽飞 2013-11-03
  • 打赏
  • 举报
回复
void main (){ char *zh=""; // 存放数组需要内存,但是这个zh只是一个指针 scanf("%c",zh);// %c是输入一个字符,不是一个字符串,用%s if(zh = "good"){ 字符串比较用strcmp函数,‘=’是赋值不是比较 printf("成功"); } else{ printf("输入错误"); } } 楼主的C基础没有看到,建议再多看点基础,按照教程做几道基础的练习题,包括数组、字符串和指针

69,371

社区成员

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

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