strtok_r 随机插入新行

strtok_r throwing in random new lines

大家好,我遇到了 strtok_r 随机插入新行的问题,想知道是否有人可以告诉我为什么要这样做?据我了解,当输入末尾有一个新行时,它正在打印一个新行,但这并不是每次都会发生,我不确定为什么。我的动机是输入一个包含多个单词的字符串,然后 strtok_r 将单词单独存储到一个数组(存储)中。

char delimit[] = " \t\r\n\v\f";
char *tempword; //temporary word until it is stored into the temp array
for (int r = 0; r < line_count; r++) {
    int counting = 0; //location of where tempword is stored in temp[counting]
    tempword = strtok_r(ptrarray[r], delimit, &ptrarray[r]);
    while (tempword != NULL && strcmp(tempword,"\n") != 0 && strcmp(tempword, "[=11=]") != 0) {
        printf("temp: %s\n", tempword);
        storage[r][counting] = strdup(tempword); 
        tempword = strtok_r(NULL, " ", &ptrarray[r]);
        counting++;   
    }
    storage[r][word_count] = NULL; //last argument = NULL for execvp function
}

strtok_r 的第三个参数应该是 char * 的地址,用于存储下一次调用 strtok_r 的内部状态,NULL 初始指针指向return 下一个令牌。您传递了要解析的字符串指针的地址,这是不正确的。您应该传递一个单独变量的地址。

此外 strtok_r 不会 return 指向换行符的指针或指向空字符串的指针,因此额外的测试是多余的。

最后,您应该为所有标记传递相同的分隔符字符串。

这是修改后的版本:

char delimiters[] = " \t\r\n\v\f";
for (int r = 0; r < line_count; r++) {
    char *tempword; //temporary word until it is stored into the temp array
    char *state;
    int counting = 0; //location of where tempword is stored in temp[counting]
    tempword = strtok_r(ptrarray[r], delimiters, &state);
    while (tempword != NULL) {
        printf("temp: %s\n", tempword);
        storage[r][counting] = strdup(tempword); 
        tempword = strtok_r(NULL, delimiters, &state);
        counting++;   
    }
    storage[r][word_count] = NULL; //last argument = NULL for execvp function
}