我正在尝试从键盘读取一系列令牌。这些保存在char []中。令牌由空格分隔。使用stok()我可以拆分字符串,但我需要评估令牌以获取进一步的操作。我的代码:
char tString[50];
if (fgets(tstring, sizeof tstring, stdin)) {
printf("%s", tstring);
}
char delimiter[] = " ";
char *ptr;
// initialisieren und ersten Abschnitt erstellen
ptr = strtok(tstring, delimiter);
while(ptr != NULL) {
printf("Abschnitt gefunden: %s\n", ptr);
// naechsten Abschnitt erstellen
ptr = strtok(NULL, delimiter);
if(ptr != '-'){
puts("HIT MINUS!");
}
}
输入2 3后,我无法获得输出HIT MINUS - 作为我的输入线。谢谢你的帮助。
答案 0 :(得分:2)
您正在比较指针:
if(ptr != '-'){
您想要比较值:
if(ptr && *ptr != '-'){
在上一次迭代期间(最后一个令牌)ptr
将为NULL,并且您不能取消引用NULL。所以我略微改变了条件。
答案 1 :(得分:2)
ptr
是字符的指针。如果你想获得它指向的角色,使用*ptr
:
if (*ptr == '-') {
puts ("HIT MINUS!");
}
你似乎也有相同的检查方式。我怀疑它应该是==
(等于),而不是!=
(不等于),所以我已将其更改为。
您可能还会在某个时候发现自己取消引用NULL指针,因此您可能也想要检查它:
if ((ptr != NULL) && (*ptr == '-')) {
puts ("HIT MINUS!");
}
答案 2 :(得分:0)
在比较之前你必须取消引用指针 - 但也要检查那里的NULL。
此外,char tString[50];
应为char tstring[50];
才能进行编译。
#include <stdio.h>
#include <string.h>
int main (int argc, char **argv){
char tstring[50];
char delimiter[] = " ";
char * ptr;
if (fgets(tstring, sizeof tstring, stdin)) {
printf("%s", tstring);
// initialisieren und ersten Abschnitt erstellen
ptr = strtok(tstring, delimiter);
while(ptr != NULL) {
printf("Abschnitt gefunden: %s\n", ptr);
// naechsten Abschnitt erstellen
ptr = strtok(NULL, delimiter);
if(ptr!= NULL && *ptr != '-'){
puts("HIT MINUS!");
}
}
}
}
答案 3 :(得分:0)
char tstring[50];
if (fgets(tstring, sizeof tstring, stdin)) {
printf("%s", tstring);
}
char delimiter[] = " ";
char *ptr;
// initialisieren und ersten Abschnitt erstellen
ptr = strtok(tstring, delimiter);
while(ptr != NULL) {
printf("Abschnitt gefunden: %s\n", ptr);
// naechsten Abschnitt erstellen
if(*ptr == '-'){ // "=="
puts("HIT MINUS!");
};
// moved to the end. Now you won't dereference NULL anyway.
// and it will work if minus is the last token in string
// and first returned by strtok()
ptr = strtok(NULL, delimiter);
}