Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
C 函数从一个调用返回两次_C_String_Gcc - Fatal编程技术网

C 函数从一个调用返回两次

C 函数从一个调用返回两次,c,string,gcc,C,String,Gcc,我正在编写一个简单的程序来尝试实现strtok。只是我自己练习一下 我想到了这个: #include <stdio.h> #include <stdlib.h> #include <string.h> char * stringtok(char * str, char * delim){ static int last; if(str != NULL){ last = 0; } char * finder; char * re

我正在编写一个简单的程序来尝试实现strtok。只是我自己练习一下

我想到了这个:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * stringtok(char * str, char * delim){
    static int last;
    if(str != NULL){ last = 0; }
    char * finder;
    char * result = malloc(100);
    while(delim[0] != '\0'){
        if(finder = strchr(str+last, delim[0])){
            memcpy(result, str + last, finder - str);
            result[finder-str+1] = '\0';
            last = finder - str;
            return result;
        }
        delim++;
    }
    return NULL;
}

int main(){
    char input[100]="This is my - message - hello can - you hear me?";
    char input2[100] = "-";
    char * pch;




    pch = stringtok(input, input2);
    while(pch != NULL){
        printf("%s\n", pch);
        pch = strtok(NULL, input2);
    }
}

我觉得很奇怪,我有一个返回结果,然后它又返回NULL,我真的不知道为什么会发生这种情况。我只是看错了gdb吗?它看起来像是从返回结果立即返回NULL。另外,看起来我的gdb输出行延迟了1行,查看printf和输出的实际位置,strok函数无法正确处理str
str
NULL
。在第一次调用时,除了最后一个偏移量之外,还需要保存字符串。现在,当您第二次调用它时,您没有任何指向原始字符串的指针。

您确定gdb不仅仅是跳到函数的末尾吗?你试过打印实际结果吗<代码>返回
返回
。它永远不会“返回”strtok()不是这样工作的。strtok通过用“\0”替换(逐个调用)找到的某些分隔符来更改原始字符串。如果在剩余字符串中未找到分隔符,则返回NULL。它将ptr保存到静态内存中替换分隔符后的下一个字符。如果传入的第一个参数为NULL,则使用保存的指针,否则使用第一个参数传入的指针。发布的代码添加了一个要求,即调用方在每次调用后从发布的代码中释放返回的指针。这不是strtok所做的。当'str'参数为NULL时,这一行:'if(finder=strchr(str+last,delim[0]){'是从地址0的某个偏移处访问内存。这是未定义的行为,可能/将导致seg故障事件。关于这一行:'char*result=malloc(100);'1)始终检查malloc(和family)返回的值确保操作成功。2)如果所选字符串的长度大于100怎么办?如果“delim”有多个字符要检查怎么办?如果“delim”为NULL而不是字符串指针怎么办?
Breakpoint 1, main () at strtok.c:22
22      int main(){
(gdb) s
23          char input[100]="This is my - message - hello can - you hear me?";
(gdb)
29
(gdb)
stringtok (
    str=0x7fffffffe040 "This is my - message - hello can - you hear me?",
    delim=0x7fffffffdfd0 "-") at strtok.c:7
7           if(str != NULL){ last = 0; }
(gdb)
9           char * result = malloc(100);
(gdb)
10          while(delim[0] != '\0'){
(gdb)
11              if(finder = strchr(str+last, delim[0])){
(gdb)
12                  memcpy(result, str + last, finder - str);
(gdb)
13                  result[finder-str+1] = '\0';
(gdb)
14                  last = finder - str;
(gdb)
15                  return result;
(gdb)
19          return NULL;
(gdb)
main () at strtok.c:30
30          pch = stringtok(input, input2);
(gdb)
31          while(pch != NULL){
(gdb)
This is my
32              printf("%s\n", pch);
(gdb)
30          pch = stringtok(input, input2);
(gdb)
34          }
(gdb)
0x000000363d21ed5d in __libc_start_main () from /lib64/libc.so.6
(gdb)
Single stepping until exit from function __libc_start_main,
which has no line number information.

Program exited normally.
(gdb)