Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将由空格分隔的数字字符串转换为整数数组_C - Fatal编程技术网

C 将由空格分隔的数字字符串转换为整数数组

C 将由空格分隔的数字字符串转换为整数数组,c,C,我试图构建一个递归函数,该函数获取一个字符串(char数组),该字符串应包含由空格或制表符分隔的数字,以及应插入的数字量,并将每个数字插入一个int数组。 我不能对这个函数使用任何循环,只能使用递归。 两个数字之间的空格和制表符数量未知。(尽管字符数组是一个1000字符的缓冲区) 我使用gets_s作为输入字符串。 如果字符串中有错误的字符或插入的数字量不正确,函数将打印错误并重新启动自身(再次省略任何循环)。 +/-允许使用符号和前导零(001) 到目前为止,我有一个函数,它获取一个字符数组,

我试图构建一个递归函数,该函数获取一个字符串(char数组),该字符串应包含由空格或制表符分隔的数字,以及应插入的数字量,并将每个数字插入一个int数组。 我不能对这个函数使用任何循环,只能使用递归。 两个数字之间的空格和制表符数量未知。(尽管字符数组是一个1000字符的缓冲区) 我使用gets_s作为输入字符串。 如果字符串中有错误的字符或插入的数字量不正确,函数将打印错误并重新启动自身(再次省略任何循环)。 +/-允许使用符号和前导零(001)

到目前为止,我有一个函数,它获取一个字符数组,该数组包含一个有效的数字,并将其值返回为int(例如
{'-','1','5','\0'}
将返回
-15

为了在我的程序中使用这个数组,将字符串转换成int数组的最佳方法是什么


谢谢

将指向整数数组结尾的指针作为函数的参数传递给函数,并将指向字符串中当前字符的指针传递给函数。如果不是空白,则将数字添加到int数组并递增int指针。适当增加char指针的值,即REGARDLESS和recurse。我假设您可以处理将字符串转换为int的问题,如果没有,有很多帖子可以提供帮助。

听起来像是您需要的工具。这是我会用的。可以递归地将字符串读入int数组。我还将创建一个包含501个位置的int数组,因为这是您可以获得的最大int数(如果每个int只是一个单位数,并且它们之间只有一个空格)


或者,您可以在我写的评论中使用

这种“不要使用最合适的工具来解决”的问题对你来说应该是个危险信号;你的资源,不管是什么,都在教你以不恰当的方式解决问题。为什么在现实世界中,有人不在C中使用循环呢?或者,如果作者想教授函数式编程,为什么他们会使用非函数式语言,如C找一本更好的书

尽管如此,在这里我发现自己提供了一个答案

首先,从技术上讲,它们都是循环!我推测,当您声明不能使用任何循环时,您实际上指的是过程循环(即从
goto
while
do…while
for
)构建的循环,而不是函数循环(由递归函数应用程序构建)。它们在技术上都是循环,而且由于C是一种过程语言,所以应该使用过程循环。尽管如此

有一种模式程序循环可以通过观察和再现模式转换为功能循环。也就是说,每个过程循环都有一个等价的函数循环,它们最终看起来非常相似。寻找下面的模式

下面是一个包含基本过程循环的函数:

。。。这是一个功能循环:

void functional_loop_on_str(char const *source, size_t source_position, int *dest, size_t dest_position) {
    if (source[source_position] != '\0') {
        source_position++;
        functional_loop_on_str(source, source_position, dest, dest_position);
    }
}
这两段代码看起来很相似,不是吗?基于这一观察,任何程序循环都可以简单地转换为功能等价物;您所要做的就是添加填充到循环中的额外代码。作为一个练习,考虑隔离这个代码的部分是相同的。在两段代码中,它们通常位于同一位置;它们不难找到!事实上,以下是这些不同之处:

    while ...                                  if ...
                                                   functional_loop_on_str...
当需要回溯时,唯一的困难就出现了,这与这个问题无关。因此,您应该能够轻松地编写过程版本并将其转换为功能版本。请允许我首先向大家介绍:

void procedural_loop_on_str(char const *source, size_t source_position, int *dest, size_t dest_position) {
    while (source[source_position] != '\0') {
        int value, nbytes, success = sscanf(source + source_position, "%d%n", &value, &nbytes);
        if (!success) { nbytes = 1; }
        else { /* XXX: You do this part!
                *      You need to do something with value, dest and dest_position */
        }
        source_position += nbytes;
    }
}
。。。在这里,它通过复制模式转换为我们的功能版本:

注意这两个例子之间的实际变化是多么的小;大部分图案仍然存在还记得上面的练习吗?好的,你可以在这里做同样的事情,发现当从程序转换到功能时,相同的更改发生在相同的地方

我认为如果你读过一本关于函数式编程的(更好的)书和一本关于C编程的(更好的)书,或者自己创建这些基本示例来观察这个模式,那么这个模式对你来说是显而易见的。尽管如此,我坚持我的信念:

  • 您不应该在C或任何过程语言中使用函数循环,但尤其不应该在C中使用函数循环;如果C是为每天的功能循环设计的,那么标准中就有优化保证。如果你的指南是指导,否则,考虑选择一个新的指南,如与巨人蓝色“C”的书,由C Kernighan和里奇的创始人祖先(选择第二版)。我会让你去找那个
  • 您不应该使用过程语言来研究函数元素。这是一个不需要动脑筋的问题。考虑方案;有一本关于Scheme的非常好的“向导书” 不管怎样,看来你需要一本更好的书

    “什么是最好的方法…”使用循环:)这种“不要使用最合适的工具来解决”的问题应该是你的危险信号;你的资源,不管是什么,都在教你以不恰当的方式解决问题。为什么在现实世界中,有人不在C中使用循环呢?或者,如果作者想教授函数式编程,为什么他们会使用非函数式语言,如C?找一本更好的书!但我认为仅仅因为它提供了愚蠢的递归示例就说“获得一本更好的书”有点苛刻。如果你要介绍递归,第一个例子总是愚蠢的,因为有意义的递归候选者的第一步太复杂了。@Persixty“有意义的递归候选者的第一步太复杂了”,对于没有在合适的环境中充分研究递归的人来说
    void procedural_loop_on_str(char const *source, size_t source_position, int *dest, size_t dest_position) {
        while (source[source_position] != '\0') {
            int value, nbytes, success = sscanf(source + source_position, "%d%n", &value, &nbytes);
            if (!success) { nbytes = 1; }
            else { /* XXX: You do this part!
                    *      You need to do something with value, dest and dest_position */
            }
            source_position += nbytes;
        }
    }
    
    void functional_loop_on_str(char const *source, size_t source_position, int *dest, size_t dest_position) {
        if (source[source_position] != '\0') {
            int value, nbytes, success = sscanf(source + source_position, "%d%n", &value, &nbytes);
            if (!success) { nbytes = 1; }
            else { /* XXX: You do this part!
                    *      You need to do something with value, dest and dest_position */
            }
            source_position += nbytes;
            functional_loop_on_str(source, source_position, dest, dest_position)
        }
    }