空字符串输入上的strtok()分段错误 #包括 #包括 #包括 #定义最大输入长度1024 char*readline(文件*fp,int最大长度) { //通过输入临时值扩展大小 char*str; int-ch; int len=0; int current_max=最大长度; str=(char*)malloc(sizeof(char)*当前最大值); 如果(!str) 返回str; 而((ch=fgetc(fp))!=EOF) { /*将换行处理与EOF处理分开*/ 如果((字符)ch='\n') { str[len]='\0'; 返回str; } str[len++]=ch; 如果(len==当前最大值) { 当前最大值=当前最大值+最大长度; str=realloc(str,sizeof(char)*当前最大值); 如果(!str) 返回str; } } str[len]='\0'; 返回str; } 内部主(空) { 字符*输入,*标记; 输入=读线(标准输入,最大输入长度); printf(“之前”); token=strtok(输入“”;//此处出现分段错误 printf(“AFTER”);//控件在“”或“\n”输入时从未到达此处。 }

空字符串输入上的strtok()分段错误 #包括 #包括 #包括 #定义最大输入长度1024 char*readline(文件*fp,int最大长度) { //通过输入临时值扩展大小 char*str; int-ch; int len=0; int current_max=最大长度; str=(char*)malloc(sizeof(char)*当前最大值); 如果(!str) 返回str; 而((ch=fgetc(fp))!=EOF) { /*将换行处理与EOF处理分开*/ 如果((字符)ch='\n') { str[len]='\0'; 返回str; } str[len++]=ch; 如果(len==当前最大值) { 当前最大值=当前最大值+最大长度; str=realloc(str,sizeof(char)*当前最大值); 如果(!str) 返回str; } } str[len]='\0'; 返回str; } 内部主(空) { 字符*输入,*标记; 输入=读线(标准输入,最大输入长度); printf(“之前”); token=strtok(输入“”;//此处出现分段错误 printf(“AFTER”);//控件在“”或“\n”输入时从未到达此处。 },c,segmentation-fault,strtok,C,Segmentation Fault,Strtok,在上面的代码片段中,我试图将whitspace上的字符串标记为分隔符。每当我以换行符(按ENTER键)或一系列空格的形式输入时,strtok()调用segfaults。据我所知,它应该返回NULL,我应该在稍后的健全性检查中处理它,但事实并非如此 请帮帮我,我遗漏了什么?您对故障发生位置的分析不正确 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_INPUT_LEN

在上面的代码片段中,我试图将whitspace上的字符串标记为分隔符。每当我以
换行符(按ENTER键)
一系列空格
的形式输入时,
strtok()
调用segfaults。据我所知,它应该返回
NULL
,我应该在稍后的健全性检查中处理它,但事实并非如此


请帮帮我,我遗漏了什么?

您对故障发生位置的分析不正确

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

#define MAX_INPUT_LENGTH 1024

char *readline(FILE* fp, int max_length)
{
    //The size is extended by the input with the value of the provisional
    char *str;
    int ch;
    int len = 0;
    int current_max = max_length;

    str = (char*)malloc(sizeof(char)*current_max);
    if(!str)
        return str;

    while((ch = fgetc(fp))!=EOF)
    {
        /* Separate newline handling from EOF handling */
        if((char)ch == '\n')
        {
            str[len] = '\0';
            return str;
        }
        str[len++] = ch;

        if(len == current_max)
        {
            current_max = current_max + max_length;
            str = realloc(str, sizeof(char)*current_max);
            if(!str)
                return str;
        }
    }
    str[len] = '\0';

    return str;
}


int main(void)
{
    char *input, *token;

    input = readline(stdin, MAX_INPUT_LENGTH);

    printf("BEFORE\n");
    token = strtok(input, " "); //Segmentation Fault Here
    printf("AFTER"); //control never reaches here on " " or "\n" input.
}
事实上,控制权确实到达了那里。你只是看不到“AFTER”消息,因为那里没有换行符或同花顺。将代码更改为此,神秘感就会消失:

printf("AFTER"); //control never reaches here on " " or "\n" input.

我敢打赌你不能用你的MCVE复制这个错误,因为它确实到达了
main
的末尾,这会刷新输出。你忘了MCVE中的“V”。您需要验证它是否复制了问题。

。您如何知道您的
malloc()
是否成功?您是否介意创建一个?无法复制:或者您正在尝试使用
标记的值而不检查它是否为空?
printf("AFTER\n");