代码之家  ›  专栏  ›  技术社区  ›  Adonai

在C中创建get string函数时出现问题

  •  1
  • Adonai  · 技术社区  · 7 年前

    我试图创建一个简单的函数,以安全的方式返回字符串,我想知道这段代码有什么问题。
    我决定使用read,因为scanf和fgets都给e带来了麻烦, 具体地说,如果我溢出缓冲区,即使是长度检查,scanf也会给出中止陷阱6,
    虽然fgets接受输入,但如果插入的字符串太长,则返回错误消息,但无论如何都要预翻转该字符串,而不允许我重新输入另一个字符串。
    代码如下:

    string get_string(const string prompt)
    {
        char temp[30];
        int size,count;
        printf("%s",prompt);
        do
        {
            count=read(0,temp,29);
            temp[count]='\0';
            size=strlen(temp);
            if(size>24)
            {
                printf("\x1B[31mError\x1B[0m: too long.\n%s",prompt);
            }
            printf("size :%i\n",size);
        }
        while(size>24);
        stripc(temp,'\n'); //removes new line
        string word=malloc((size)*sizeof(char));
        strcpy(word,temp);
        return word;
    }
    

    现在使用read时,它会给我类似的错误,我从stdin读取了总共30个字节,
    然后我在计数器的末尾添加空字符,但如果长度超过,则输出为:

    ppppppppppppppppppppppppppppp
    Error: too long.
    size :30
    size :2
    p
    

    知道问题出在哪里吗?
    有没有其他方法来实现我的需求?

    编辑:问题没有超出范围,
    奇怪的是,一旦我写了超过24个字符,
    应读取输入(read、scanf、fgets或其他)的函数,
    不再激活,这就是为什么大小:连续出现两次,
    由于某种原因,输入插入被跳过,我想了解原因。
    我纠正了一些错误。

    2 回复  |  直到 7 年前
        1
  •  0
  •   user3121023    7 年前

    如果在第一个输入中没有找到换行符,则调用fgets,直到找到换行符,以便清理输入流,然后继续外部while循环。

    string get_string(const string prompt)
    {
        char temp[26] = "";//24 + newline + '\0'
        int size,count;
        while ( 1)
        {
            printf ( "%s",prompt);
            if ( fgets ( temp, sizeof temp, stdin)) {
                if ( !strchr ( temp, '\n')) {//no newline
                    printf("\x1B[31mError\x1B[0m: too long.\n%s",prompt);
                    size = strlen ( temp);
                    do {
                        fgets ( temp, sizeof temp, stdin);//read more and discard
                        size += strlen ( temp);
                    } while (!strchr ( temp, '\n'));//loop until newline found
                    printf("size :%i\n",size);
                    continue;//re prompt
                }
                break;
            }
            else {
                fprintf ( stderr, "fgets problem\n");
                return NULL;
            }
        }
    
        temp[strcspn ( temp,"\n")] = '\0';//remove newline
        string word = malloc(strlen ( temp) + 1);
        strcpy ( word, temp);
        return word;
    }
    
        2
  •  -1
  •   Paul Ogilvie    7 年前

    这是一个又一次的老错误。。。

    C中的字符串是 null终止 . 这意味着保存字符串的内存必须大于字符串的长度。

    您检查读取的字符串是否不超过24个字符,但在malloc中,您没有为空字符添加空间。因此 strcpy 放置空字符 在你的记忆之外 .