c - 如果我们想在 C 程序中调用多于 1 个 switch 语句,我该怎么办?
问题描述
例如,如果我想在 for 循环中调用 switch 语句,我得到一个错误。我该如何纠正这个问题?如果我想在确定的条件下移动我的 switch 语句外部部分,这将使用超过调用 switch 语句。提前致谢。
#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
#define SIZE 50
int i = 0;
int main() {
char usertxt[SIZE], myoperator[SIZE];
printf("addition='+',subtraction='-',multiplication='*',division='/'\n");
usertxt[0] = 0;
int x, myarray[SIZE];
printf("How many numbers should be entered? ");
scanf_s("%d", &x);
for (i = 0; i < x; i++) {
scanf_s(" %c", &myoperator[i], 1);
switch (myoperator[i]) {
case '+':printf("Addition operation\n");
printf(" Enter your number: ");
scanf_s("%d", &myarray[i]);
usertxt[i] = printf("%d%c", myarray[i], myoperator[i]);
break;
case '-':printf("Subtraction operation\n");
printf("Enter your numbers: ");
scanf_s("%d", &myarray[i]);
usertxt[i] = printf("%d%c", myarray[i], myoperator[i]);
break;
case '*':printf("Multiplication operation\n");
printf("Enter your numbers: ");
scanf_s("%d", &myarray[i]);
usertxt[i] = printf("%d%c", myarray[i], myoperator[i]);
break;
case '/':printf("Division operation\n");
printf("Enter your numbers: ");
scanf_s("%d", &myarray[i]);
usertxt[i] = printf("%d%c", myarray[i], myoperator[i]);
break;
default :if (myoperator[i] == '\0') {
break;
};
}
}
}
解决方案
正如@Gerhardh 所说,欢迎来到SO。但我真的认为你的代码背后的逻辑还不够好。我花了一些时间来了解您的目标,并制作了一个更清晰的新版本。
在测试和理解您的代码时,我遇到了以下问题:
- 函数“scanf_s”的隐式声明在 C99 中无效
- 将全局变量声明为计数器及其在循环内的使用是您的代码无法按预期工作的主要原因。
- printf() 函数用于打印输出。它返回打印的字符数。如果有一些错误,那么它返回一个负值。您使用它就像它返回一个字符甚至一个字符串一样。
- 如果您必须始终执行相同的操作,则 Switch 语句将毫无用处。
- 字符读取无法正常工作。
我将在此处附上更新的代码。希望它会有所帮助,并且实际上它具有与您的代码相同的“目标”。
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
#define SIZE 500
#define nOperator 4
int main() {
char usertxt[SIZE], myoperator[nOperator];
printf("addition='+',subtraction='-',multiplication='*',division='/'\n");
usertxt[0] = 0;
int nOperations;
int x, myarray[SIZE];
printf("How many numbers should be entered? ");
scanf("%d", &x);
printf("How many operations would you like to try? ");
scanf("%d", &nOperations);
for (int i = 0; i < nOperations; i++) {
fseek(stdin, 0, SEEK_END);
printf("\n\nEnter operation #%d: ", i + 1);
myoperator[i] = getchar();
for (int j = 0; j < x; j++) {
printf("Enter number #%d: ", j + 1);
scanf("%d", &myarray[j]);
}
int k = 0;
for (int m = 0; m < x; m++) {
if (m == x - 1) {
usertxt[k] = myarray[m];
printf("%d", myarray[m]);
} else {
usertxt[k] = myarray[m];
usertxt[k + 1] = myoperator[i];
printf("%d%c", myarray[m], myoperator[i]);
}
k++;
}
printf("\n\n");
}
}
正如你所看到的,我尽量靠近你的代码想法和实现。例如,我没有删除初始编译指示和定义。可能您稍后会使用它们。我已经按照此处的建议使用了 fseek(...): 如何在 C 中清除输入缓冲区? 为了一起正确读取字符和整数。
首先,它会读取您想要使用的数字以及您想要执行的操作数。之后,它会获取与某个操作相关的数字,最后,它会像您在自己的代码中所做的那样打印表达式。如果要添加结果,只需在代码中进行一点编辑即可将数组中的所有数字相加或在从输入中读取时对它们进行计数。
变量计数器说明:
- i 用于“myoperator”数组
- k 用于 'usertxt' 数组
- m 用于“myarray”数组
下一步:
- 添加结果变量以显示操作的结果
- 使用动态内存
请注意: fseek(...) 适用于某些系统;如果不是,那也就不足为奇了,因为当标准输入是一个交互式设备(或像管道、套接字或 FIFO 等不可搜索的设备,仅举几例其他方式时,它可以失败)。
如果您需要它必须是可移植的,请检查我之前放置的链接。希望对您有所帮助。
干杯,丹尼
推荐阅读
- c++ - 什么是 msvc_x64_x64 以及与 msvc_x64 有何不同
- c# - 如何在 C# 中隐藏打印弹出窗口?
- python - 损失在 Pytorch 中不会收敛,但在 TensorFlow 中会收敛
- javascript - 为什么打印此变量会显示提示,而不是错误消息?
- git - 试图从功能分支中挑选:没有“樱桃”?
- sql - 使用 HQL 计算两个字段的差异之间的范围
- nginx - nginx 从 x-forwarded 获取源客户端 ip 以使用 map 模块
- java - 无法在杰克逊 xml 中序列化 OffsetDateTime
- java - Selenium Webdriver:拖放不起作用
- typescript - 如何在 Vue 模板中为来自 Apollo 的数据启用 Typescript 输入(VS Code)