c中的字符算术;总线错误

时间:2014-10-01 22:37:51

标签: c arrays math char bus

我的程序应该接受2个字符串并进行算术运算。

示例:

输入:abc + aab

输出:abc + aab => BCE

程序获取用户输入字符串并将2个部分加载到多维数组中,并将算术符号的char变量加载到该数组中。 它应该将字符转换为它们的数字等价(ASCII)来进行算术运算。 然后它应该再次输出值作为字符。当数值超过26时,它从字符串的第一部分获取字符并输出其大写形式。

示例:

输入:d + y

输出:d + y => d

这看起来很简单,但我对java更有经验,我认为我的代码中存在导致运行时错误的转换丢失:总线错误  第44行:if(a [2] [i]> = 27){

供参考,当我编译时我输入:gcc -g -o prog06 prog06.c -lm

然后使用gdb运行我输入:gdb prog06

到目前为止

代码:

/* My Name
   C & Unix
   prog06
*/

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

main() {
  int i, j, k, a[3][9];
  char input[19], b, c[10];
  system("clear");

  printf("This is a string arithmatic program of SOS form.\n");

input:
  printf("Input: ");
  scanf("%s", input);
  for (i = 0; i < strlen(input); i++){
    if (input[i] != '+' || input[i] != '-' || input[i] != '/' || input[i] != '*'){
      a[j][k] == input[i] - '`';
      k++;              //Converts input to a multidimensional string array
      continue;             //a[][] + char b for arithmatic character.
    }
    if (input[i] == '+' || input[i] == '-' || input[i] == '/' || input[i] == '*'){
      a[j][k+1] = '\0';
      b = input[i];
      j++;
      k = 0;
      continue;
    }

  }
  if (b == '+') goto add;
  if (b == '-') goto sub;
  if (b == '/') goto div;
  if (b == '*') goto mul;

add:
  i = 0;
  do {
    a[2][i] = a[0][i] + a[1][i];
    if (a[2][i] >= 27){
      a[2][i] = a[0][i] + 64;
    }
    i++;
  } while (a[0][i] != '\0' || a[1][i] != '\0'); j = i;
  printf("\n%s + %s => ", a[0], a[1]);
  goto output;

sub:

div:

mul:

output:
  for (i = 0; i < j; i++){
    c[i] = a[2][i];
  }
  printf("%s", c);
}

2 个答案:

答案 0 :(得分:1)

要修复的示例

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

int main(void) {
    int i, j, k, a[3][9];
    char input[19], b, c[10];
    system("clear");

    printf("This is a string arithmatic program of SOS form.\n");

input:
    printf("Input: ");
    scanf("%18s", input);
    for(k = j = i = 0; input[i]; ++i){
        if(islower(input[i])){
            if(j == 0)
                a[2][k] = input[i];
            a[j][k++] = input[i] - 'a' + 1;
        } else if(strchr("+-/*", input[i])){
            b = input[i];
            ++j;//! Operator is assumed one
            k = 0;
        } else {
            //Illegal characters are present
            goto error_proc;
        }
    }
    if (b == '+') goto add;
    if (b == '-') goto sub;
    if (b == '/') goto div;
    if (b == '*') goto mul;

error_proc:
    while(getchar()!='\n');
    goto input;

add:
    for(i=0; i < k; ++i){//! k : it's assuming the length of the operand is equal
        if(a[2][i] + a[1][i] > 'z')
            a[2][i] = toupper(a[2][i]);
        else
            a[2][i] = 'a' + a[0][i] + a[1][i] - 1;
    }
    goto output;

sub:
    goto end;
div:
    goto end;
mul:
    goto end;

output:
    for(i = 0; i < k; ++i){
        c[i] = a[2][i];
    }
    c[i] = '\0';
    printf("%s", c);

end:
    return 0;
}

答案 1 :(得分:0)

一个立即出现的问题是jk都未初始化。我不知道Java,但在C中,未初始化的变量未设置为0 - 它包含垃圾值。最终结果是未定义的行为。我无法解释为什么它在第44行(而不是在第23行)失败,但这是UB的本质。

修复初始化并查看问题是否仍然存在。