无法连接strtok的输出变量。 strcat和strtok

我已经花了几个小时在这个程序上,并花了几个小时在线搜索我的方法的替代品,并在整个晚上一直困扰着崩溃和错误……

我有一些我想用这段代码实现的东西。 首先,我将解释我的问题,然后我将发布代码,最后我将解释我对该程序的需求。

程序只输出单个单词,连接函数什么都不做。 这似乎应该足够简单来修复……

我的第一个问题是我似乎无法使concatenate函数工作,我使用了通用的strcat函数,它没有工作,也没有我在互联网上找到的另一个版本(这个函数在这里使用,它被称为“mystrcat” )。 我希望用字符串读取程序并删除“分隔符”以创建由原始字符串中的每个单词组成的单个字符串。 我正在尝试使用strtok和strcat函数。 如果有一个更简单或更简单的方式请尽我所有的耳朵。

另一个问题,不一定是一个问题,而是一个丑陋的混乱:主要的七行。 我更喜欢按如下方式初始化变量:char variable [amt]; 但我发现strtok的代码是使用指针,而strcat函数的代码是使用指针。 更好地理解字符串的指针和地址可能会帮助我长期。 但是,我想以任何必要的方式摆脱其中的一些线索。 我不能只有2行专用于2个变量。 当我有10个变量时,我不想要30行顶部…

#include  #include  #include  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

我正在关注这篇文章:关于如何使concatenate函数工作或者替换strcat和/或strtok的问题。 以及寻求帮助以整理不必要或冗余的代码。

我感谢所有帮助,甚至所有阅读我post的人。

非常感谢!

如果你在循环中使用first而不是firstOrigstrcat会工作。 不需要mystrcat 。 可以简化为:

 #include  #include  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 

这里有几个问题:

  1. 缺少resultOrig和firstOrig (正如codaddict指出的那样)。

  2. first = &firstOrig不能做你想做的事。 你稍后做first = strtok(str, delims) ,它first设置指向str某个地方。 它不会将数据读入firstOrig

  3. 你分配小缓冲区(只有20个字节),并尝试用它来填充它们。 它会溢出堆栈。 造成讨厌的错误。

您尚未初始化以下两个字符串:

 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] = "";