strtok中的长度可变

时间:2012-12-10 03:46:55

标签: c strtok

我已经看过一些例子并尝试做某事,但现在我被卡住了。

工作代码是

    char quality[5][10];
    char * qualities;
    qualities = strtok (message, "\n");
    int k = 0;
    while (qualities != NULL){
        if (k == 0) {
            strcpy(quality[0], qualities);
        }
        else if ( k == 1) {
            strcpy(quality[1], qualities);
        }
        else if ( k == 2) {
            strcpy(quality[2], qualities);
        }
        else if ( k == 3) {
            strcpy(quality[3], qualities);
        }
        else if ( k == 4) {
            strcpy(quality[4], qualities);
        }           
        qualities = strtok (NULL, "\n");
        k++;
    }

然而,这适用于固定长度(在这种情况下只有5),但是我想将一个变量分配给质量变量,但在这种情况下,循环不起作用。我该怎么办?

2 个答案:

答案 0 :(得分:2)

替换此块

if (k == 0) {
        strcpy(quality[0], qualities);
} else if ( k == 1) {
    strcpy(quality[1], qualities);
} else if ( k == 2) {
    strcpy(quality[2], qualities);
} else if ( k == 3) {
    strcpy(quality[3], qualities);
} else if ( k == 4) {
    strcpy(quality[4], qualities);
}
qualities = strtok (NULL, "\n");
k++;

这两行:

strcpy(quality[k++], qualities);
qualities = strtok (NULL, "\n");

这是一个等效的代码,但它可以使用任意数量的项目,最多可以使用quality数组中的元素数量。

由于元素数量是固定的,您应该更改

while (qualities != NULL)

while (k < N && qualities != NULL)

其中Nqualities中的元素数量。

答案 1 :(得分:0)

您将能够使用以下代码有效地模拟当前循环(但具有动态长度):

while (qualities != NULL){
    if(k<sizeOfYouArray)
        strcpy(quality[k], qualities);           
    qualities = strtok (NULL, "\n");
    k++;
}

基本上,不是检查k的每个单独值并相应地采取行动,而是应该继续调用strcpy,直到k大于sizeOfYourArray(类似于如果sizeOfYourArray设置为5 strcopy将不再被调用,那么当前代码将如何操作。

从长远来看,这对于您的程序来说可能不是最有效或最有效的解决方案(如果我正确理解您的代码,for循环可能会更好地运行),但这将是所需的最低更改。< / p>