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
}
大家好,我遇到了 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
}