Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法连接strtok';s输出变量。strcat和strtok_C_Pointers_Concatenation_Delimiter_Strtok - Fatal编程技术网

无法连接strtok';s输出变量。strcat和strtok

无法连接strtok';s输出变量。strcat和strtok,c,pointers,concatenation,delimiter,strtok,C,Pointers,Concatenation,Delimiter,Strtok,我花了几个小时在这个程序上,花了几个小时在网上搜索我的方法的替代品,整个晚上都被崩溃和错误所困扰 我想用这段代码实现一些事情。首先我将解释我的问题,然后我将发布代码,最后我将解释我对该程序的需求 程序只输出单个字,而串联函数不执行任何操作。这看起来应该足够简单来修复 我的第一个问题是,我似乎无法让连接函数工作,我使用了通用strcat函数,但它不工作,我在互联网上找到的另一个版本也没有(该函数在这里使用,它被称为“mystrcat”)。我想让程序读入一个字符串并删除“分隔符”,以创建一个由原始字

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

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

程序只输出单个字,而串联函数不执行任何操作。这看起来应该足够简单来修复

我的第一个问题是,我似乎无法让连接函数工作,我使用了通用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;
}
#包括
#包括
#包括
char*mystrcat(char*output,char*firstptr);
int main(){
char str[]=“现在是所有好人来帮助他们国家的时候了”;
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;
第一个=strtok(str,delims);
while(第一个!=NULL){
mystrcat(结果,第一个);
printf(“%s”,第一个);
printf(“\n%s这应该是到目前为止的concat字符串\n”,resultOrig);
first=strtok(空,delims);
}
系统(“暂停”);
返回0;
}
char*mystrcat(char*resultptr,char*firstptr)
{
char*output=resultptr;
而(*输出!='\0')
输出++;
而(*firstptr!='\0')
{
*输出=*firstptr;
输出++;
firstptr++;
}
*输出='\0';
返回输出;
}
现在这只是一个测试程序,但我打算将其用于文件列表/数据库。我的文件有下划线、连字符、句点、括号和数字;所有这些我都想设置为“分隔符”。我计划遍历一个循环,在这个循环中,我将删除一个分隔符(每个循环遍历从u-to–to.等更改)并创建一个字符串,我可能希望用空格或句点替换分隔符。有些文件中已经有空格,还有我想“划界”的特殊字符

我打算通过扫描一个文本文件来完成这一切。在这个文件中,我还有一个这样的大小:“25186452”。我希望我能按字母顺序或大小、升序或降序对数据库进行排序。这只是一些额外的信息,可能对我上面的具体问题有用

下面我列举了一些虚构的例子,说明这些名字是如何出现的。 我的文件(2009).ext second.File-group1.extls .third.file-vol30.lmth

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

我感谢所有的帮助,甚至感谢所有读过我文章的人


非常感谢你

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

char resultOrig[20];
char firstOrig[20];
您正在向它们添加字符。将其更改为:

char resultOrig[20] = "";
char firstOrig[20] = "";
字符数组的名称也给出了它的起始地址。所以

result = &resultOrig;
first = &firstOrig;
应该是:

result = resultOrig;
first = firstOrig;
改变

mystrcat(resultOrig, firstOrig);

还要使
resultOrig
足够大,以容纳串联,如:

char resultOrig[100] = "";

如果在循环中使用
first
而不是
firstOrig
,则strcat将起作用。不需要
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;
}

这里有几个问题:

  • 缺少
    resultOrig
    firstOrig
    的初始化(正如codaddict指出的)

  • first=&firstOrig
    并不能满足您的需要。稍后您将执行
    first=strtok(str,delims)
    ,它将
    first
    设置为指向
    str
    中的某个位置。它不会将数据读入
    firstOrig

  • 您可以分配小的缓冲区(仅20个字节),并尝试用比这个多得多的内容填充它们。这会使堆栈溢出。引起讨厌的虫子


  • 我已经更改了将您的建议应用到我的代码中,它似乎不会将结果打印为concat'd字符串。添加:char
    resultOrig[20]=“”当我拥有时,为代码做很多事情:
    char*result=NULL在下一行?谢谢大家的帮助,我现在已经让字符串连接完全按照我想要的方式工作,并添加了一个
    strcat(result,“.”)以句点分隔所有内容。我仍然不明白为什么我不能在cat功能中先尝试一个简单的
    。。。有人能解释一下为什么
    first
    有效,而
    firstOrig
    无效吗。一个是指针,另一个是字符数组,但指针与字符数组相同,只是物理地址不同,对吗?它的值指向
    firstOrig
    的值,是吗?
    firstOrig
    是一个空缓冲区的起始地址,您从未放入任何东西。分配
    #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