Невозможно объединить выходную переменную strtok. strcat и strtok
Я потратил часы на эту программу и провел несколько часов в Интернете в поисках альтернатив для моих методов, и весь вечер меня мучили сбои и ошибки...
У меня есть несколько вещей, которых я хотел бы достичь с помощью этого кода. Сначала я объясню свои проблемы, затем выложу код и, наконец, объясню свою потребность в программе.
Программа выводит только отдельные слова, а функция сцепления ничего не делает. Кажется, это должно быть достаточно просто исправить...
Моя первая проблема заключается в том, что я не могу заставить работать функцию сцепления, я использовал стандартную функцию strcat, которая не работала, и ни одна другая версия, которую я нашел в интернете (эта функция используется здесь, она называется "mystrcat").). Я хочу, чтобы программа прочитала строку и удалила разделители, чтобы создать единственную строку, состоящую из каждого слова в исходной строке. Я пытаюсь сделать с помощью strtok и функции strcat. Если есть более простой или простой способ, ПОЖАЛУЙСТА, я все уши.
Еще одна проблема, которая не обязательно является проблемой, а представляет собой ужасный беспорядок: семь строк, следующих за основной. Я бы предпочел инициализировать мои переменные следующим образом: char variable[amt]; но код, который я нашел для strtok, использовал указатель, а код для функции strcat использовал указатели. Лучшее понимание указателей и адресов для строк, вероятно, поможет мне в долгосрочной перспективе. Однако я хотел бы избавиться от некоторых из этих строк любыми необходимыми средствами. У меня не может быть 6 строк, выделенных только для 2 переменных. Когда у меня есть 10 переменных, я не хочу 30 строк вверху...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *mystrcat(char *output, char *firstptr);
int main() {
char str[] = "now # is the time for all # good men to come to the # aid of their country";
char delims[] = "# ";
char resultOrig[70]; //was [20];
char firstOrig[20];
//char *result = NULL, *first = NULL;
char result = resultOrig; //was result = &resultOrig;
char first = firstOrig; //was first = &firstOrig;
first = strtok( str, delims );
while( first != NULL ) {
mystrcat(resultOrig, firstOrig);
printf( "%s ", first );
printf("\n %s this should be the concat\'d string so far\n", resultOrig);
first = strtok( NULL, delims );
}
system("pause");
return 0;
}
char *mystrcat(char *resultptr, char *firstptr)
{
char *output = resultptr;
while (*output != '\0')
output++;
while(*firstptr != '\0')
{
*output = *firstptr;
output++;
firstptr++;
}
*output = '\0';
return output;
}
Сейчас это всего лишь тестовая программа, но я собирался использовать ее для списка / базы данных файлов. Мои файлы имеют подчеркивания, дефисы, точки, скобки и цифры; все, что я хотел бы установить в качестве "разделителей". Я планировал пройти через цикл, где я удаляю разделитель (каждое изменение цикла от _ до - к. И т. Д.) И создаю одну строку, я могу захотеть заменить разделители пробелом или точкой. И в некоторых файлах уже есть пробелы вместе со специальными символами, которые я хотел бы "разделить".
Я планирую сделать все это путем сканирования текстового файла. В этом файле у меня также есть размер в этом формате: "2,518,6452". Я надеюсь, что смогу отсортировать свою базу данных по алфавиту или по размеру, по возрастанию или по убыванию. Это всего лишь дополнительная информация, которая может быть полезна для моих конкретных вопросов выше.
Ниже я включил несколько вымышленных примеров того, как эти имена могут появиться. my_file(2009).ext second.File-group1.extls the.third.file-vol30.lmth
Я сосредотачиваюсь на этом посте: вопрос о том, как заставить работать функцию сцепления или альтернативу strcat и / или strtok. А также просить помощи, чтобы освободить ненужный или избыточный код.
Я ценю всю помощь и даже всех тех, кто прочитал мой пост.
Спасибо вам большое!
3 ответа
strcat
будет работать, если вы использовали first
вместо firstOrig
в вашей петле. Нет необходимости mystrcat
, Можно упростить до:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "now # is the time for all # good men to come to the # aid of their country";
char delims[] = "# ";
char result[100] = ""; /* Original size was too small */
char* token;
token = strtok(str, delims);
while(token != NULL) {
printf("token = '%s'\n", token);
strcat(result, token);
token = strtok(NULL, delims);
}
printf("%s\n", result);
return 0;
}
Выход:
token = 'now'
token = 'is'
token = 'the'
token = 'time'
token = 'for'
token = 'all'
token = 'good'
token = 'men'
token = 'to'
token = 'come'
token = 'to'
token = 'the'
token = 'aid'
token = 'of'
token = 'their'
token = 'country'
nowisthetimeforallgoodmentocometotheaidoftheircountry
Вы не инициализировали следующие две строки:
char resultOrig[20];
char firstOrig[20];
и вы добавляете к ним персонажей. Измените их на:
char resultOrig[20] = "";
char firstOrig[20] = "";
Также имя массива символов дает его начальный адрес. Так
result = &resultOrig;
first = &firstOrig;
должно быть:
result = resultOrig;
first = firstOrig;
+ Изменить
mystrcat(resultOrig, firstOrig);
в
mystrcat(resultOrig, first);
также сделать resultOrig
быть достаточно большим, чтобы содержать конкатенации, например:
char resultOrig[100] = "";
Здесь есть несколько проблем:
Отсутствующие инициализации здесь
resultOrig
а такжеfirstOrig
(как указал кодаддикт).first = &firstOrig
не делает то, что вы хотите от этого. Вы позже делаетеfirst = strtok(str, delims)
, который устанавливаетfirst
указать куда-то вstr
, Он не читает данные вfirstOrig
,Вы выделяете небольшие буферы (всего 20 байтов) и пытаетесь заполнить их гораздо большим, чем это. Это переполнило бы стек. вызывая неприятные ошибки.