我已经有一段时间没有使用C了,我正在尝试编写一个简单的实用程序,它接受一个输入字符串并返回一个字符串数组。
draw 1 2 3
输出数组为:
out[0] = draw
out[1] = 1
out[2] = 2
out[3] = 3
我感谢和所有的帮助,请善良,我最近主要使用C#,它有一个非常好的字符串。分裂函数!
下面是我尝试过的,找到了一些示例代码,并试图修改它。
#include<stdio.h>
#include <string.h>
char outPut[50][50] splitString(char str[200])
{
int iCount = 1;
// Returns first token
char* token = strtok(str, " ");
outArray[0] = token;
// Keep printing tokens while one of the
// delimiters present in str[].
while (token != NULL)
{
printf("%s\n", token);
token = strtok(NULL, " ");
outArray[iCount] = token;
iCount++;
}
}
int main ()
{
char str[200];
char outArr[50][50];
puts ("Enter text:");
gets(str);
outArr = splitString(str);
for (int i=0; i<outArr.length; i++)
{
printf(Array element %d is %s", i, outArr[i]);
}
return 0;
}
1条答案
按热度按时间dgtucam11#
如何从函数返回数组
在C语言中,不能直接返回数组。函数
main
必须告诉函数splitString
它应该写入的数组地址。因此,您应该将函数splitString
的参数更改为:由于数组不能作为函数参数传递,因此两个数组参数都将decay指向指向数组第一个元素的指针。对于二维数组,参数将衰减为指向外部数组第一个元素的指针。
我把返回类型改为
int
,因为函数splitStrings
必须告诉函数main
它找到了多少个token并写入数组,所以函数splitStrings
返回这个数字是有意义的。现在可以从函数
main
调用函数splitString
,如下所示相当于
因为数组衰减为指向其第一个元素的指针。
如何复制字串
在C中,不能复制如下字符串:
实际上,你告诉编译器要做的是复制指针
token
(而不是它所指向的字符串)并将其赋值给数组。这是行不通的,因为你不能给数组本身赋值。你只能给数组中的各个元素赋值。如果要复制指针指向的字符串而不是指针本身,则应使用函数
strcpy
,如下所示:由于数组到指针的衰减,此函数调用等效于:
但是,由于目标数组只有
49
字符加上终止空字符的空间,因此您应该首先验证标记是否太长,否则可能会导致buffer overflow,这可能会导致程序崩溃或以其他方式出现错误行为。是否使用函数
gets
函数
gets
非常危险,因此已从ISO C标准中删除,因为没有办法防止缓冲区溢出,除非输入来自受信任的来源。因此,您应该停止使用此函数,而改用fgets
。有关详细信息,请参阅以下问题:Why is the gets function so dangerous that it should not be used?
请注意,如果您使用
fgets
而不是gets
,则通常会在输入的末尾有一个换行符。您通常会希望删除它。请参阅以下问题了解如何删除它:Removing trailing newline character from fgets() input
固定代码
在应用了上面提到的所有修复程序,并应用了一些其他的小改进之后,您的代码应该如下所示:
此程序具有以下行为: