【问题标题】:Reading and effectively storing decimal numbers from character strings without scanning?无需扫描即可从字符串中读取并有效存储十进制数?
【发布时间】:2020-11-22 17:49:03
【问题描述】:

我没有太多经验,我正在尝试从字符串中读取这些正数和负数十进制数作为双精度数并有效地存储它们,以便可以在更大的范围内对它们进行一一评估for 循环。如果数字给出正确(注释掉),我的评估是有效的,但我正在努力阅读和传递十进制数字。此代码不起作用并陷入循环,直到出现段错误。

由于输入之间有空格,最好以某种方式使用 strtok() 还是我尝试的方法合适?

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>

char input[1024] = "3.2 -5.1 3.7";
char numchar[1024];
int i = 0, j = 0;
char *ptr1;
double val;
int main()
{   
    ptr1 = input;
    for(i=0;i<strlen(input);i++)
    {    

        if(isalnum(input[i]) || input[i] == '.')
            {
            while(input[i] != 32)
                {
                numchar[j++] = input[i];                    
                val = strtod(numchar,&ptr1);
                printf("Val = %lf\n", val);
                printf("ptr = %s", ptr1);
                }
            //tempVal = val
            //push(tempVal);
            }
        //EVALUATION OF CURRENT NUMBER HERE
    }
}

【问题讨论】:

  • 为什么不能使用sscanf()
  • 旁注: 执行for(i=0;i&lt;strlen(input);i++) 会将工作量从 O(n) 增加到 O(n**2)。最好这样做:int len = strlen(input); for(i=0;i&lt;len;i++) 或者,更好的是,这样做:for(ptr1 = input; *ptr1 != 0; ++ptr1) 并将所有 input[i] 替换为 *ptr1 另外,当你这样做 strtod 时,numcharnot 0 终结者。

标签: c string character


【解决方案1】:

strtod可以遍历字符串解析doubles
需要两个指针。
strtod 的第二个参数将指向下一个无法解析的字符。将其用作下一次迭代时解析的第一个字符。
如果next == each,则无法解析任何字符。

#include<stdio.h>
#include<stdlib.h>

int main()
{
    char input[1024] = "3.2 -5.1 3.7";
    char *each = input;
    char *next = input;
    double val;

    while ( *next)
    {
        val = strtod ( each, &next);
        if ( next == each) {
            break;
        }
        printf ( "Val = %lf\n", val);
        each = next;
    }
}

【讨论】:

    【解决方案2】:

    欢迎使用 StackOverflow。

    如果您的输入确实被一个或多个空格分隔,那么strtok() 似乎是合适的。 strtok() 非常适合一般标记输入字符串。

    但是,由于您的令牌是数字,strtod() 更方便。

    因为您似乎是 C 新手,所以这里有一些建议:

    • 你应该写' '而不是32,因为你正在寻找一个空间。空格具有 ASCII 值 32 的事实与您正在做的事情相去甚远。使您的代码尽可能有意义;意义很重要!
    • 在代码中添加更多空格:#include &lt;stdio.h&gt;for (i = 0; i &lt; strlen(input); i++)while (...)strtod(numchar, &amp;ptr1);
    • 您可以在这里写:char input[] = "3.2 -5.1 3.7";,但不定义大小。
    • 太好了,您将{s 放在下一个空行中。这使代码块在视觉上保持一致,并避免了有时(即缺乏一致性)在代码块顶部添加空行的需要,例如 if-condition 跨越多行。

    【讨论】:

    • strtok() 在这里如果数字用空格分隔则过大了,因为strtod() 将跳过前导空格,并返回一个指向解析数字后第一个字符的指针。所以可以直接用来解析字符串。它还有一个额外的好处是它不会修改输入字符串,因此它不会在像 strtok() 这样的字符串文字上爆炸。
    猜你喜欢
    • 1970-01-01
    • 2015-12-25
    • 2018-09-11
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2012-02-20
    • 2018-02-02
    • 2019-04-15
    相关资源
    最近更新 更多