我的程序应该接受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);
}
答案 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)
一个立即出现的问题是j
和k
都未初始化。我不知道Java,但在C中,未初始化的变量未设置为0 - 它包含垃圾值。最终结果是未定义的行为。我无法解释为什么它在第44行(而不是在第23行)失败,但这是UB的本质。
修复初始化并查看问题是否仍然存在。