C 将由空格分隔的数字字符串转换为整数数组
我试图构建一个递归函数,该函数获取一个字符串(char数组),该字符串应包含由空格或制表符分隔的数字,以及应插入的数字量,并将每个数字插入一个int数组。 我不能对这个函数使用任何循环,只能使用递归。 两个数字之间的空格和制表符数量未知。(尽管字符数组是一个1000字符的缓冲区) 我使用gets_s作为输入字符串。 如果字符串中有错误的字符或插入的数字量不正确,函数将打印错误并重新启动自身(再次省略任何循环)。 +/-允许使用符号和前导零(001) 到目前为止,我有一个函数,它获取一个字符数组,该数组包含一个有效的数字,并将其值返回为int(例如C 将由空格分隔的数字字符串转换为整数数组,c,C,我试图构建一个递归函数,该函数获取一个字符串(char数组),该字符串应包含由空格或制表符分隔的数字,以及应插入的数字量,并将每个数字插入一个int数组。 我不能对这个函数使用任何循环,只能使用递归。 两个数字之间的空格和制表符数量未知。(尽管字符数组是一个1000字符的缓冲区) 我使用gets_s作为输入字符串。 如果字符串中有错误的字符或插入的数字量不正确,函数将打印错误并重新启动自身(再次省略任何循环)。 +/-允许使用符号和前导零(001) 到目前为止,我有一个函数,它获取一个字符数组,
{'-','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编程的(更好的)书,或者自己创建这些基本示例来观察这个模式,那么这个模式对你来说是显而易见的。尽管如此,我坚持我的信念:
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)
}
}