arrays - 如何在没有 strtok 的情况下正确使用字符串拆分
问题描述
我正在尝试制作一个 C 字符串计算器。这意味着我有一个带有数字和中间分隔符的字符串。分隔符可以是任意大小,只要它不是数字即可。此外,如果特定数字的值介于 1001 和 1111 之间,则不能使用它并将被忽略(设置为零)。此分配的困难在于使定界/拆分字符串部分不带strtok
. 我得到了各种错误的输出,我不知道我做错了什么,但我觉得我在疏忽某些事情或做一些非常愚蠢的事情。该代码还冻结了我的单元测试,所以我什至无法测试出了什么问题。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>
void ValidateInput(int *x) {
if (*x >= 1001 && *x <= 1111) {
x = 0;
}
}
int test(char *numbers, int numbers_length, int *result) {
char cnum1[numbers_length];
char cnum2[numbers_length];
strcpy(cnum1, "");
strcpy(cnum2, "");
bool x = false;
size_t i = 0;
while (numbers[i] != '\0') {
char c = numbers[i];
if (isdigit(c)) {
if (x) {
strcat(cnum2, &c);
}
if (!x) {
strcat(cnum1, &c);
}
}
if (!isdigit(c)) {
x = true;
}
i++;
}
int num1;
num1 = atoi(cnum1);
int num2 = atoi(cnum2);
ValidateInput(&num1);
ValidateInput(&num2);
printf("%d\n", num1);
printf("%d\n", num2);
return num1 + num2;
}
int main() {
int sum;
char numbers[] = "100,10";
int length = strlen(numbers);
test(numbers, length, &sum);
return -1;
}
解决方案
代码中存在一些问题:
x = 0
inValidateInput()
在函数之外没有任何影响。你应该写*x = 0;
strcat(cnum2, &c);
不正确:&c
不是正确的 C 字符串。您应该即时转换数字或使用索引附加字符。test()
不需要字符串的长度,它可以测试空终止符。if (!x)
并且if (!isdigit(c))
是多余的,只需使用一个else
子句。test()
返回总和,它不应将总和的地址作为参数,其返回值应存储sum
在main()
函数中。
这是修改后的版本:
#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
void ValidateInput(int *x) {
if (*x >= 1001 && *x <= 1111) {
*x = 0;
}
}
int test(char *numbers) {
int num1 = 0;
int num2 = 0;
bool x = false;
for (size_t i = 0; numbers[i] != '\0'; i++) {
unsigned char c = numbers[i];
if (isdigit(c)) {
if (x) {
num2 = num2 * 10 + c - '0';
} else {
num1 = num1 * 10 + c - '0';
}
} else {
x = true;
}
}
ValidateInput(&num1);
ValidateInput(&num2);
printf("%d\n", num1);
printf("%d\n", num2);
return num1 + num2;
}
int main() {
char numbers[] = "100,10";
int sum = test(numbers);
printf("sum=%d\n", sum);
return 0;
}
推荐阅读
- ssis - SQL 代理中的 SSIS - “连接管理器中未指定目录”
- database - 将查询作为 sql 参数传递时如何在 CURL 命令行中对查询进行编码
- python - 关于两个看起来相似的代码的效率问题
- c - 使用 C 进行 JSON 解析
- python - Docx 文件已锁定,无法编辑
- oracle - 查找列中连续相似值的计数 - Oracle
- session - 未在 Edge 上设置会话 cookie(点网核心)
- java - 来自android studio的应用程序在我的手机上不断崩溃
- jenkins - “仅在 SCM 更改时构建”在 jenkins 作业中设置为 true,但不使用最新提交构建
- c# - 将元组传递给 ObjectDataProvider 参数