Intereting Posts

Проблемы с арифметикой указателей – попытка ввода токена в строку

В настоящее время я работаю над программой, которая позволяет пользователю вводить строку, которая затем символизируется, а затем жетоны печатаются на экране с помощью массива указателей. Это «предполагается» для этого, вызывая мою функцию токенизации, которая считывает входную строку до первого разделителя (”, ‘,’, ‘.’, ‘?’, ‘!’). Затем он меняет этот разделитель в моей строке на символ NULL. Затем он должен вернуть указатель на следующий символ в моей строке. В основном после ввода строки он должен продолжать вызывать функцию tokenize, которая возвращает указатели, которые затем сохраняются в массиве указателей, чтобы позже печатать мои токены. Как только tokenize () возвращает указатель на символ NULL, который находится в конце моей строки, он прерывается из этого цикла. Затем я печатаю маркеры, используя мой массив указателей. // пытаясь быть детализированным

#include  #include  char *tokenize ( char *text, const char *separators ); int main ( void ) { char text[30]; char separators[6] = { ' ','.',',','?','!','\0'}; char *pch = NULL; int tokens[15]; int i = 0; int j = 0; printf("Enter a string: \n"); fgets( text, 30, stdin ); printf("%s", text ); pch = tokenize ( text, separators ); do { pch = tokenize ( pch, separators ); //printf("%c", *pch); tokens[i] = pch; i++; } while( *pch != NULL ); i--; while( j != i ) { printf("%s", tokens[i] ); j++; } return 0; } char *tokenize ( char *text, const char *separators ) { while( text != NULL ) { if( text != NULL ) { while( separators != NULL ) { if( text == separators ) { text = '\0'; } separators++; } } text++; } return text; } 

В настоящее время существует 3 известных проблемы. 1.Когда я компилирую, он читает строку, затем печатает ее, а затем застревает в бесконечном цикле без печати, все еще пытаясь получить вход. 2. Im довольно уверен я использую «*» для моих указателей в неправильном месте. 3. Моя функция передает ссылку на мои массивы, поэтому я предположил, что могу просто увеличивать их, как есть.

Я ценю любую обратную связь! Я буду смотреть этот пост постоянно. Если я оставил что-то непонятное, я могу отреагировать. Благодарю.

У вас была правильная идея для решения проблемы, но у вас было множество ошибок pointer/int в вашем коде. Убедитесь, что вы скомпилируете свой код с включенными предупреждениями , это скажет вам, где у вас проблемы с кодом. (не ожидайте, что ваш код будет работать правильно, пока вы не устраните все предупреждения). Как минимум, скомпилируйте с параметрами -Wall -Wextra в вашей команде сборки.

Есть гораздо более простые способы сделать это, но для изучения опыта это отличное упражнение. Ниже приведен код с исправленными ошибками. По возможности, я оставил ваш исходный код commented чтобы вы могли видеть, где были проблемы. Я также добавляю немного кода для удаления newline включенной fgets в конце text . В то время как это не требуется, хорошей практикой является отсутствие фильтра newlines через ваш код.

Дайте мне знать, если у вас есть вопросы:

 #include  #include  char *tokenize ( char *text, const char *separators ); int main ( void ) { char text[30]; char separators[6] = { ' ','.',',','?','!','\0'}; char *pch = NULL; char *tokens[15] = {0}; /* declare array of pointers */ int i = 0; int j = 0; printf("Enter a string: \n"); fgets( text, 30, stdin ); size_t len = strlen (text); if (text[len-1] == '\n') /* strip newline from text */ text[--len] = 0; pch = text; /* pch pointer to next string */ char *str = text; /* str pointer to current */ do { pch = tokenize ( str, separators ); /* pch points to next */ tokens[i++] = str; /* save ptr to token */ str = pch; /* new start of str */ } while (pch != NULL && *pch != 0); /* test both pch & *pch */ printf ("\nTokens collected:\n\n"); while (tokens[j]) /* print each token */ { printf(" token[%d]: %s\n", j, tokens[j] ); j++; } printf ("\n"); return 0; } char *tokenize ( char *text, const char *separators ) { const char *s = separators; /* must use pointer to allow reset */ //while( text != NULL ) while( *text != '\0' ) { s = separators; /* reset s */ while( *s != 0 ) /* 0 is the same as '\0' */ { //if( text == separators ) if( *text == *s ) { //text = '\0'; *text = '\0'; return ++text; } s++; } text++; } return text; } 

Пример вывода:

 $ ./bin/tokenizestr Enter a string: This is a test string Tokens collected: token[0]: This token[1]: is token[2]: a token[3]: test token[4]: string 

Возможно, вам захочется взглянуть на strsep и это сообщение. Разделить строку с разделителями на C. Если вам нужно больше опорных точек, попробуйте найти «split string», это то, что вы хотите сделать, если я правильно понял.