-3

我有一个字符串,里面有:

2@0.88315@1@1.5005@true@0.112它继续...

我需要将每个 2 或更大的数字切换为 1,所以我写了这个:

for (i = 0 ; i < strlen(data) ; i++)
{
    if (data[i] >= 50 && data[i] <= 57) // If it's a number
    {
        data[i] = '1'; // switch it to one
        while (data[i] >= 48 && data[i] <= 57)
        {
           i++;
        }
     }
 }

问题是,它也将 0.051511 之类的数字变成 1.111111 ...因为它不会将双倍视为一个数字,而是将每个数字分开...我该怎么做?谢谢

4

3 回答 3

3

为了澄清这个问题,因为它不清楚,您需要以下输入:

"2@0.88315@1@1.5005@true@0.112"

修改为如下:

"1@0.88315@1@1@true@0.112"

您的问题是您需要将每个数字解析为浮点值以进行任何类型的比较。要么这样,要么您需要通过检查“。”来手动解析它。特点。由于 C 标准库提供了可以帮助您的函数,因此手动执行此操作是僵化的、容易出错且不必要的。

由于这是家庭作业,因此我将为您提供一些有关如何解决此问题而不是实际解决方案的提示。您应该做的是尝试使用这些步骤编写解决方案,如果遇到困难,请使用您编写的代码编辑原始问题、失败的地方以及您认为失败的原因。

您的第一步是将输入标记为以下内容:

"2"
"0.88315"
"1"
"1.5005"
"true"
"0.112"

这可以通过遍历字符串并拆分它或使用指针来完成,然后出现“@”字符。拆分字符串可以使用strtok. 但是,strtok将通过修改字符串来拆分字符串,这在我们的情况下不一定需要。更简单的方法是简单地遍历字符串并在每次到达“@”字符后停止。然后输入将被标记为以下内容:

"2@0.88315@1@1.5005@true@0.112"
"0.88315@1@1.5005@true@0.112"
"1@1.5005@true@0.112"
"1.5005@true@0.112"
"true@0.112"
"0.112"

其中一些子字符串不以表示浮点数的字符串开头。您将需要确定他们中的哪一个。为此,您可以尝试将每个字符串的前面解析为浮点数。这可以通过sscanf. 解析浮点数后,您将能够进行所需的比较。

您正在尝试将字符串修改为不同的长度,因此在将浮点值替换为“1”时,您需要检查原始值的长度。如果它长于 1 个字符,则必须将后续字符向前移动。例如:

"3.423@1"

如果您解析第一个标记并发现它是> 2,则将第一个字符替换为“1”。这导致:

"1.423@1"

然后,您仍然需要通过将字符串的其余部分向下移动来删除该标记的其余部分以获得:

"1@1"
于 2012-06-13T18:06:49.107 回答
0

看起来您正在比较 if 语句中的 achar和 an int

您应该弄清楚为什么这很重要并对其进行补偿。

于 2012-06-13T18:03:41.583 回答
0

您一次比较一个字符串中的字符。如果您需要将“@”符号之间的所有内容视为一个数字,这将不起作用。尝试将这些数字放入一个数组中,将它们转换为双精度数,然后与 2 进行比较。

于 2012-06-13T18:19:52.923 回答