【问题标题】:Getting error in following c code [Segmentation fault]在以下 c 代码中出现错误 [分段错误]
【发布时间】:2015-06-22 14:05:59
【问题描述】:

使用*s 而不是char s 时出现分段错误。 如果我将*s 更改为s,我会收到名为char 整数指针的错误。请帮我找出错误。我也用Google 搜索过,但无法更正。

#include<stdio.h>


main()
{
char *s,o,a,b,j[20];
printf("code generation\n----------------------");
printf("Enter the code:\n");
scanf("%s",j);
int c=1;
while(c==1){
        o=j[1];
        a=j[0];
        b=j[2];

        switch(o){
        case '+':
               s="ADD";
                break;
            case '-':
                s="SUB";
                break;
            case '*':
                s="MUL";
                break;
            case '/':
                s="DIV";
                break;
            case '=':
                s="MOV";
                break;
            default:
                s="INV";
        }
        printf("Code Generated:%s %s , %s\n",s,a,b);

}



 }

【问题讨论】:

  • @AlterMann 我只是编辑并修复了它
  • 如果 1) 用户输入的内容超过 19 个字符 2) 如果用户只输入一个字符并且 3) 请参阅 @SouravGhosh 的回答,则您的代码会出现未定义行为
  • C 具有允许名称中包含多个字符的功能,主要是为了使它们自动记录。下次您提出问题时,请使用更具描述性的名称。

标签: c segmentation-fault printf format-specifiers


【解决方案1】:

对于类似的定义

char *s,o,a,b,j[20];
  • s 的类型为 char *
  • oab 的类型为 char
  • j 的类型为 char [20](数组)。

所以,你需要修改你的代码

printf("Code Generated:%s %s , %s\n",s,a,b);

printf("Code Generated:%s %c , %c\n",s,a,b);

char 的正确格式说明符是 %c

建议:

  1. 总是更喜欢int main(void) 而不是main()
  2. 启用编译器警告并注意它们。

相关阅读:来自C11标准,第§7.21.6.1章,fprintf()函数(强调我的)

如果转换规范无效,则行为未定义。 如果任何参数不是相应转换规范的正确类型,则行为未定义。

还有,关于undefined behaviour 的注释。

【讨论】:

  • 好答案,C-FAQ 中有一个related question
  • @CoolGuy § 被称为选择符号。使用“§” [希望此实例正确打印。] 在 HTML 中。 :-)
【解决方案2】:

在您的代码中,ab 是字符变量而不是字符串。 把你的printf改成这样。

%c 是字符的格式说明符。

printf("Code Generated:%s %c , %c\n",s,a,b);

你必须为指针变量char *s分配内存。并使用 strcpy 将值分配给该变量。

s=malloc(30);
strcpy(s,"ADD");

【讨论】:

  • s不需要分配内存。
【解决方案3】:

听起来有点离题,但这一行:

 printf("Code Generated:%s %s , %s\n",s,a,b);

ab 不是字符串 (=char*),而是字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    相关资源
    最近更新 更多