Есть ли способ, с помощью которого я могу получить определенный токен в строке? В моем коде я использовал strtok() для синтаксического анализа токена строки за токеном, но мне нужно достичь первого токена, второго токена, третьего токена и т. д. для сопоставления каждого токена в переменной (например, если первый токен переменная A, то она должна быть равна y, если вторая переменная токена равна z, то она должна быть равна w) Вот мой код. В моем коде будут некоторые ошибки, извините за это:
char parsetokens(){
char string[] = "A B(10) < z3";
char specialchar[] = ":,=+-*/><[]() ";
char *token = strtok(string,specialchar);
while (token!=NULL)
{
printf ("%s\n", token);
token = strtok (NULL, specialchar);
}
for(token=string[0];*token!=0;token++){
if (token==y)
{
var.op=5; //I want to match the first token's variable which is A to the y
}
printf ("%s\n",var.op);
}
} ```
Извините, но я не мог понять. Вопрос такой понятный, минимальный и перед публикацией он был проверен системой.
Это может быть отправной точкой:
int main() {
char * token = ":,=+-*/><[]()";
char * string = "A : B : C + D - E << (F)";
int index;
int len = strlen(string);
int tokenCount = strlen(token);
char tk[2] = {0};
for (char i=0; i<tokenCount; i++) {
index = 0;
tk[0] = token[i];
char *sub = NULL;
while (index < len && (sub = strstr(string + index, tk))) {
index = (sub - string);
printf("%s at index : %d\n", tk, index);
index++;
}
}
return 0;
}
Выход :
: at index : 2
: at index : 6
+ at index : 10
- at index : 14
< at index : 18
< at index : 19
( at index : 21
) at index : 23
Это имеет смысл! Попробую с этой логикой, спасибо!
Я понял, что приращение index
произошло слишком рано, поэтому я изменил это: первый найденный индекс равен 2, а не 3 (но приращение все еще происходит после печати, чтобы избежать бесконечного цикла).
Да, я тоже это понял, когда работал, большое спасибо. Однако логика была настолько близка к моему вопросу, что в моем выводе следует исключить специальные символы. Например, если строка: [A B[x:y] > Z] и проанализированные токены должны быть такими: A B x y Z. Таким образом, индекс синтаксического анализа должен быть похож на A в индексе: 1 B в индексе: 3 и т. д.. .@dspr
strspn
и strcspn
можно использовать для перебора строки и идентификации токенов, разделенных набором символов.
#include <stdio.h>
#include <string.h>
int main ( void) {
char string[] = "[A B[x:y] > Z] ";
char specialchar[] = ":,=+-*/><[]() ";
char *token = string;
size_t index = 0;
while ( *token) {
token += strspn ( token, specialchar);//count matching characters
index = strcspn ( token, specialchar);//count non-matching characters
if ( index) {
printf ("%.*s at index %d\n"
, (int)index, token, (int)(token - string));
}
token += index;
}
}
Обновлено:
#include <stdio.h>
#include <string.h>
int main ( void) {
char string[] = "[A B[x:y] > Z] ";
char item[sizeof string] = "";
char specialchar[] = ":,=+-/*><[]() ";
char *token = string;
size_t index = 0;
while ( *token) {
token += strspn ( token, specialchar);//count matching characters
index = strcspn ( token, specialchar);//count non-matching characters
if ( index) {
memmove ( item, token, index);
item[index] = 0;
printf ("item: %s\n", item);
printf ("%.*s at index %d\n"
, (int)index, token, (int)(token - string));
}
token += index;
}
}
Это решит мою проблему в огромной степени! Большое спасибо! Оценил!
Пожалуйста, опубликуйте минимальный воспроизводимый пример: stackoverflow.com/help/minimal-reproducible-example