使用 strtok 并尝试将它们的值存储到数组中
Using strtok and trying to store their values into an array
我是 C 的新手,我一直在尝试一些东西,但它似乎并没有真正起作用:
我有一个数组 char *initialParts;
,我根据用户的输入分配 space,但我认为这并不重要。
我还有一个计数器 initialPartsCounter = 0;
用作索引,以便在分配的内存的每个索引处存储一个字母。
到目前为止,我得到了这个:
char *initialParts;
const char comma[3] = ",";
int initialPartsCounter = 0;
initialParts = (char*)malloc((int)numInitialParts * sizeof(char));
char *token;
token = strtok(fileLine, comma);
while (token != NULL) {
strcpy(&initialParts[initialPartsCounter], token);
initialPartsCounter++;
token = strtok(NULL, comma);
}
for (int l = 0 ; l < (int)numInitialParts; l++)
{
printf("%c", initialParts[l]);
}
其中numInitialParts是用户输入的数字,fileLine是读入文件的一行。
在下面的示例中,numInitialParts = 4
、and fileLine = 'q,d,c,k'
在我的 for 循环中,打印的输出很奇怪:qdck☐☐☐☐
(我无法复制 k 之后的字符,因为当我粘贴它时它什么也没做,但它有些相似,请检查图片以查看它的外观).
编辑:我的理想输出是:
qdck
如果有人有解决此问题的想法,我将很高兴听到。谢谢!
initialParts = (char*)malloc((int)numInitialParts * sizeof(char));
你应该使用双指针或二维数组来存储token
(因为它是字符序列(字符串)而不是字符)。如果你不知道之前有多少份,你可以用realloc
每次增加numInitialParts
例如:
char **initialParts = malloc(sizeof(char*));
// check initialParts here
token = strtok(fileLine, comma);
while (token != NULL) {
initialParts[initialPartsCounter] = malloc(sizeof(char) * 2);
// check initialParts[initialPartsCounter] here
strcpy(initialParts[initialPartsCounter], token);
initialPartsCounter++;
initialParts = realloc((initialPartsCounter+1)*sizeof(char));
// check initialParts here
token = strtok(NULL, comma);
}
因为你打印
printf("%c", initialParts[l]);
我可以猜到initialParts被定义为一个char *
然后动态分配。
strtok
一般用于获取各种长度的token。即使您可能确定原始逗号分隔字符串仅由一个字符组成,但当您执行
strcpy(&initialParts[initialPartsCounter], token);
您正在将至少两个字符复制到字符数组:令牌字符(例如'q')和字符串终止符'[=17=]'
(字符串只是一个以零结尾的字符数组,所有字符串操作函数都依赖于它)。
随心所欲
initialParts[initialPartsCounter] = *token;
确实这不是主要错误。事实上,尽管它显示出对 strtok
如何工作的一些误解,但它会一直工作,直到 initialParts
数组中有足够的空间来存储当前字符和字符串终止符。
另一个错误是,虽然您从 strtok
解析中只得到 initialPartsCounter
个字符,但您打印了数组 (numInitialParts
) 的所有字符。最后的那些将毫无意义,因此更正它代码将按预期工作。
以下示例将您的代码嵌入到一个简单的主函数中(我手动定义了输入`char fileLine[] = "q,d,c,k"):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *initialParts, *token;
char fileLine[] = "q,d,c,k";
const char comma[3] = ",";
int initialPartsCounter = 0, numInitialParts = 20;
initialParts = (char*)malloc((int)numInitialParts * sizeof(char));
token = strtok(fileLine, comma);
while (token != NULL)
{
//strcpy(&initialParts[initialPartsCounter], token);
initialParts[initialPartsCounter] = *token; //Use this only if tokens are only one char long
initialPartsCounter++;
token = strtok(NULL, comma);
}
for (int l = 0 ; l < initialPartsCounter; l++)
{
printf("%c", initialParts[l]);
}
printf("*end\n");
free(initialParts);
return 0;
}
我还打印了一个 结束字符串 以显示没有任何尾随意外字符。输出是
qdck*end
我是 C 的新手,我一直在尝试一些东西,但它似乎并没有真正起作用:
我有一个数组 char *initialParts;
,我根据用户的输入分配 space,但我认为这并不重要。
我还有一个计数器 initialPartsCounter = 0;
用作索引,以便在分配的内存的每个索引处存储一个字母。
到目前为止,我得到了这个:
char *initialParts;
const char comma[3] = ",";
int initialPartsCounter = 0;
initialParts = (char*)malloc((int)numInitialParts * sizeof(char));
char *token;
token = strtok(fileLine, comma);
while (token != NULL) {
strcpy(&initialParts[initialPartsCounter], token);
initialPartsCounter++;
token = strtok(NULL, comma);
}
for (int l = 0 ; l < (int)numInitialParts; l++)
{
printf("%c", initialParts[l]);
}
其中numInitialParts是用户输入的数字,fileLine是读入文件的一行。
在下面的示例中,numInitialParts = 4
、and fileLine = 'q,d,c,k'
在我的 for 循环中,打印的输出很奇怪:qdck☐☐☐☐
(我无法复制 k 之后的字符,因为当我粘贴它时它什么也没做,但它有些相似,请检查图片以查看它的外观).
编辑:我的理想输出是:
qdck
如果有人有解决此问题的想法,我将很高兴听到。谢谢!
initialParts = (char*)malloc((int)numInitialParts * sizeof(char));
你应该使用双指针或二维数组来存储token
(因为它是字符序列(字符串)而不是字符)。如果你不知道之前有多少份,你可以用realloc
每次增加numInitialParts
例如:
char **initialParts = malloc(sizeof(char*));
// check initialParts here
token = strtok(fileLine, comma);
while (token != NULL) {
initialParts[initialPartsCounter] = malloc(sizeof(char) * 2);
// check initialParts[initialPartsCounter] here
strcpy(initialParts[initialPartsCounter], token);
initialPartsCounter++;
initialParts = realloc((initialPartsCounter+1)*sizeof(char));
// check initialParts here
token = strtok(NULL, comma);
}
因为你打印
printf("%c", initialParts[l]);
我可以猜到initialParts被定义为一个char *
然后动态分配。
strtok
一般用于获取各种长度的token。即使您可能确定原始逗号分隔字符串仅由一个字符组成,但当您执行
strcpy(&initialParts[initialPartsCounter], token);
您正在将至少两个字符复制到字符数组:令牌字符(例如'q')和字符串终止符'[=17=]'
(字符串只是一个以零结尾的字符数组,所有字符串操作函数都依赖于它)。
随心所欲
initialParts[initialPartsCounter] = *token;
确实这不是主要错误。事实上,尽管它显示出对 strtok
如何工作的一些误解,但它会一直工作,直到 initialParts
数组中有足够的空间来存储当前字符和字符串终止符。
另一个错误是,虽然您从 strtok
解析中只得到 initialPartsCounter
个字符,但您打印了数组 (numInitialParts
) 的所有字符。最后的那些将毫无意义,因此更正它代码将按预期工作。
以下示例将您的代码嵌入到一个简单的主函数中(我手动定义了输入`char fileLine[] = "q,d,c,k"):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *initialParts, *token;
char fileLine[] = "q,d,c,k";
const char comma[3] = ",";
int initialPartsCounter = 0, numInitialParts = 20;
initialParts = (char*)malloc((int)numInitialParts * sizeof(char));
token = strtok(fileLine, comma);
while (token != NULL)
{
//strcpy(&initialParts[initialPartsCounter], token);
initialParts[initialPartsCounter] = *token; //Use this only if tokens are only one char long
initialPartsCounter++;
token = strtok(NULL, comma);
}
for (int l = 0 ; l < initialPartsCounter; l++)
{
printf("%c", initialParts[l]);
}
printf("*end\n");
free(initialParts);
return 0;
}
我还打印了一个 结束字符串 以显示没有任何尾随意外字符。输出是
qdck*end