切换字符串内的数字

时间:2012-06-13 18:01:08

标签: c

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

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 ...... 因为它不会将双倍视为一个数字,但每个数字都是分开的...... 我该怎么做 ? 感谢

3 个答案:

答案 0 :(得分: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"

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

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

"3.423@1"

如果您解析了第一个令牌并发现它是> 2,那么您将用“1”替换第一个字符。结果如下:

"1.423@1"

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

"1@1"

答案 1 :(得分:0)

您的if语句中似乎正在比较charint

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

答案 2 :(得分:0)

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