【问题标题】:Cannot concatenate strtok's output variable. strcat and strtok无法连接 strtok 的输出变量。 strcat 和 strtok
【发布时间】:2012-04-30 22:11:48
【问题描述】:

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

我想用这段代码实现一些目标。首先我会解释我的问题,然后我会发布代码,最后我会解释我对程序的需求。

程序只输出单个单词,而 concatenate 函数什么也不做。这看起来应该很简单,可以修复...

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

另一个问题,不一定是问题,而是一个丑陋的混乱:main 之后的七行。我更喜欢按如下方式初始化我的变量: 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”。我希望我可以按字母顺序或大小、升序或降序对我的数据库进行排序。这只是一些额外的信息,可能对我上面的具体问题有用。

下面我提供了一些关于这些名称如何出现的虚构示例。 我的文件(2009).ext second.File-group1.extls the.third.file-vol30.lmth

我将这篇文章的重点放在:关于如何让连接函数工作或替代 strcat 和/或 strtok 的问题。以及寻求帮助以整理不必要或冗余的代码。

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

非常感谢!

【问题讨论】:

  • 感谢大家的帮助,我已经将字符串连接完全按照我现在想要的方式工作,并添加了strcat(result, "."); 以用句点分隔所有内容。我仍然不明白我怎么不能在 cat func 中尝试一个普通的first...有人可以解释为什么first 有效但firstOrig 无效。一个是指针,另一个是 char 数组,但指针与 char 数组相同,但物理地址除外,对吧?它的值是指向firstOrig的值,是吗?
  • firstOrig 是您从未放入任何内容的空缓冲区的起始地址。分配first = firstOrig 不会做任何事情,因为下一行将first 重新分配给令牌。这就是为什么在我的示例中我只是删除了所有这些。

标签: c pointers concatenation delimiter strtok


【解决方案1】:

如果您在循环中使用first 而不是firstOrigstrcat 将起作用。不需要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

【讨论】:

    【解决方案2】:

    您还没有初始化以下两个字符串:

    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 打印为 concat'd 字符串。当我在下一行添加:char *result = NULL; 时,添加:char resultOrig[20] = ""; 对代码有多大作用?
    【解决方案3】:

    这里有几个问题:

    1. 缺少来自 resultOrigfirstOrig 的初始化(正如 codaddict 指出的那样)。

    2. first = &amp;firstOrig 不会做你想做的事。您稍后执行first = strtok(str, delims),它将first 设置为指向str 中的某个位置。它不会将数据读入firstOrig

    3. 您分配小缓冲区(仅 20 字节)并尝试用比这更多的内容填充它们。它会溢出堆栈。导致讨厌的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      相关资源
      最近更新 更多