我花了几个小时在这个程序上,并花了几个小时在线搜索我的方法的替代方案,并且整晚都被崩溃和错误所困扰......
我想用这段代码完成一些事情。首先,我将解释我的问题,然后我将发布代码,最后我将解释我对该程序的需求。
程序只输出单个单词,连接函数什么都不做。这似乎应该足够简单来修复......
我的第一个问题是我似乎无法使concatenate函数工作,我使用了通用的strcat函数,它不起作用,我也没有在互联网上找到另一个版本(这个函数在这里被使用,它被称为“mystrcat”)。我希望用字符串读取程序并删除“分隔符”以创建由原始字符串中的每个单词组成的单个字符串。我正在尝试使用strtok和strcat函数。如果有一个更容易或更简单的方式请尽我所有的耳朵。
另一个问题,不一定是一个问题,而是一个丑陋的混乱:主要的七行。我更喜欢按如下方式初始化变量:char variable [amt];但是我为strtok找到的代码是使用指针而strcat函数的代码是使用指针。更好地理解指针&&字符串的地址可能会帮助我长期。但是,我想以任何必要的方式摆脱其中一些线。我不能只有2行专用于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
我正在关注这篇文章:关于如何使concatenate函数工作或者替换strcat和/或strtok的问题。以及寻求帮助以整理不必要或冗余的代码。
感谢所有帮助,感谢所有阅读我帖子的人。
非常感谢你!
答案 0 :(得分: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
答案 1 :(得分:0)
您尚未初始化以下两个字符串:
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] = "";
答案 2 :(得分:0)
这里有几个问题:
缺少来自resultOrig
和firstOrig
的初始化(正如codaddict指出的那样)。
first = &firstOrig
无法满足您的需求。您稍后执行first = strtok(str, delims)
,first
将str
设置为指向firstOrig
中的某个位置。它不会将数据读入{{1}}。
您分配小缓冲区(仅20个字节)并尝试用它们填充它们。它会溢出堆栈。造成令人讨厌的错误。