首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法连接strtok的输出变量。strcat和strtok

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

Stack Overflow用户
提问于 2012-04-19 19:47:18
回答 3查看 2.9K关注 0票数 1

我花了几个小时在这个程序上,花了几个小时在网上寻找我的方法的替代品,整个晚上都被崩溃和错误所困扰…

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

程序只输出单个单词,而连接函数什么也不做。这看起来应该足够简单,可以修复……

我的第一个问题是,我似乎不能让连接函数工作,我使用了通用的strcat函数,它不工作,也没有我在互联网上找到的另一个版本(该函数在这里使用,它被称为"mystrcat“)。我想让程序读入一个字符串,并删除“分隔符”,以创建一个由原始字符串中的每个单词组成的单个字符串。我正在尝试使用strtok和一个strcat函数。如果有更简单或更简单的方法,请听我说。

另一个问题,这不一定是一个问题,而是一个丑陋的烂摊子: main后面的七行代码。我更喜欢用以下方式初始化我的变量: char variableamt;但是我找到的strtok的代码使用指针,而strcat函数的代码使用指针。从长远来看,更好地理解字符串的指针和地址可能对我有所帮助。然而,我想以任何必要的方式去掉其中的一些行。我不能只有6行代码来处理2个变量。当我有10个变量时,我不希望在…顶部有30行

代码语言:javascript
复制
#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;
}

这现在只是一个测试程序,但我打算将其用于文件列表/数据库。我的文件有下划线、连字符、句点、括号和数字;我希望将所有这些都设置为“分隔符”。我计划遍历一个循环,在那里我将删除一个分隔符(每次循环都会从_更改为to。etc…)并创建一个单独的字符串,我可能想用一个空格或句点来代替分隔符。而且一些文件中已经有空格和我想要“分隔”的特殊字符。

我计划通过扫描一个文本文件来完成所有这些工作。在文件中,我还有一个这种格式的大小:“2,518,6452”。我希望我可以按字母顺序或大小、升序或降序对我的数据库进行排序。这只是一些额外的信息,可能对我上面的具体问题有所帮助。

下面我提供了一些虚构的例子来说明这些名字是如何出现的。my_file(2009).ext second.File。文件-组1.ext.第三个文件。文件-vol30.lmth

我这篇文章的重点是:如何让连接函数工作,或者是strcat和/或strtok的替代方案。以及请求帮助来整理不必要或冗余的代码。

我感谢所有人的帮助,甚至感谢所有通读我的帖子的人。

非常感谢!

EN

回答 3

Stack Overflow用户

发布于 2012-04-19 20:33:09

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

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2012-04-19 19:54:53

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

代码语言:javascript
复制
char resultOrig[20];
char firstOrig[20];

并且您正在将字符附加到它们。将它们更改为:

代码语言:javascript
复制
char resultOrig[20] = "";
char firstOrig[20] = "";

字符数组的名称也给出了它的起始地址。所以

代码语言:javascript
复制
result = &resultOrig;
first = &firstOrig;

应该是:

代码语言:javascript
复制
result = resultOrig;
first = firstOrig;

变化

代码语言:javascript
复制
mystrcat(resultOrig, firstOrig);

代码语言:javascript
复制
mystrcat(resultOrig, first);

还要使resultOrig足够大,以容纳连接,例如:

代码语言:javascript
复制
char resultOrig[100] = "";
票数 0
EN

Stack Overflow用户

发布于 2012-04-19 20:35:33

这里有几个问题:

  1. 缺少resultOrigfirstOrig的初始化(正如codaddict指出的那样,codaddict并没有从它那里做你想要的事情。稍后执行first = strtok(str, delims),该命令将first设置为指向str中的某个位置。它不会将数据读入firstOrig.
  2. You,分配较小的缓冲区(只有20字节),并尝试用更多的缓冲区填充它们。它会使堆栈溢出。引起讨厌的bug。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10227353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档