【发布时间】:2021-08-12 06:11:26
【问题描述】:
我正在尝试制作一个 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;
}
【问题讨论】:
-
您是否尝试过在调试器中逐行运行代码,同时监控所有变量的值,以确定您的程序在哪个点停止按预期运行?如果您没有尝试过,那么您可能想阅读以下内容:What is a debugger and how can it help me diagnose problems? 您可能还想阅读以下内容:How to debug small programs?。
-
'strcat(cnum2, &c);' strcat() 需要 NUL 终止的 char 数组作为两个参数 - 传递一个 char 的地址是 UB,(除非 char 是 NUL)。
-
检查所有代码并检查所有 str* 库调用是否提供了有效参数,以及所有数组是否足够长以容纳复制的任何“字符串”,包括 NUL 终止符。
-
马上我觉得有必要指出在
ValidateInput中,您正在检查指针的值(这很好),然后如果它无效,则设置 指向 0 的指针的地址(这不好)。如果您在那之后尝试访问x,这将导致段错误。 -
源字符串中有多少个分隔符?他们应该如何跨字符串拆分?如果只有 1 个分隔符,我假设之后的所有内容都会进入第二个字符串?在您的问题中发布一两个应该如何修改数据的示例可能会有所帮助。
标签: arrays c string unit-testing pointers