小编Cha*_*ase的帖子

如何输入未知大小的字符串

我对C中的字符串有点困惑.我理解声明缓冲区大小很重要,否则会导致缓冲区溢出.但我需要知道如何获取一个我不知道其大小的字符串输入.例如,如果我想从用户那里获取一行文本作为输入,而我无法知道他们的文本有多长,我该怎么做呢?

我尝试在用户提供输入时动态分配内存.这是代码 -

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

int main()
{
    char *str, ch;
    int size = 10, len = 0;
    str = realloc(NULL, sizeof(char)*size);
    if (!str)return str;
    while (EOF != scanf_s("%c", &ch) && ch != '\n')
    {
        str[len++] = ch;
        if (len == size)
        {
            str = realloc(str, sizeof(char)*(size += 10));
            if (!str)return str;
        }
    }
    str[len] = '\0';
    printf("%s\n", str);
    free(str);
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我使用VS-2017编译它时,我得到这些错误 -

source.c(10):警告C4473:'scanf_s':没有为格式字符串传递足够的参数

source.c(10):注意:占位符及其参数需要2个可变参数,但提供了1个

source.c(10):注意:格式字符串'%c'需要缺少的可变参数2

source.c(10):注意:此参数用作缓冲区大小

我认为动态分配内存(如上面的代码)应该可行,但我可能做错了.有没有办法让这项工作?

编辑:Word.

c scanf visual-studio-2017

7
推荐指数
1
解决办法
562
查看次数

ftell 如何影响以“r”而不是“rb”模式读取的二进制文件?

我有一个相当奇怪的问题,实际上根本不是很实用。错误(以r模式读取二进制文件)显而易见,但我对其他事情感到困惑。

这是代码-

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

#define BUFFER_LEN 512

typedef uint8_t BYTE;

int main()
{
    FILE* memcard = fopen("card.raw", "r");
    BYTE buffer[BUFFER_LEN];
    int count = 0;
    while (fread(buffer, sizeof(*buffer), BUFFER_LEN, memcard) != 0)
    {
        printf("count: %d\n", count++);
    }
    fclose(memcard);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,card.raw是一个二进制文件,所以这个读取出错,因为是以rmode 而不是rb. 但我很好奇的是,该循环正好执行了 3 次,在最终执行中,它甚至没有读取 512 个字节。

现在,如果我将该循环更改为

while (fread(buffer, sizeof(*buffer), BUFFER_LEN, memcard) != 0)
{
    printf("ftell: %ld\n", ftell(memcard));
}
Run Code Online (Sandbox Code Playgroud)

它不再在执行 3 次时停止。事实上,它一直持续到(大概)文件结束。该fread计数仍搞砸。许多读取不会在读取元素时返回 512。但这很可能是由于文件以r模式打开以及它伴随的所有编码错误。 …

c binary file cs50

6
推荐指数
1
解决办法
208
查看次数

如何正确缩放开关小部件的自定义拇指?

我有一个来自可绘制对象的自定义拇指集,Switch用于LinearLayout. 我无法让它在各种屏幕上正确显示。在大多数屏幕上,它看起来像这样——

正确的

这很好,但在某些屏幕上(例如 - 440 dpi),它看起来像这样 -

错误的

如何使其在所有屏幕上看起来统一?我尝试了很多方法,包括switchMinWidth设置android:width=为 0dp、使用,thumbTextPadding但没有任何效果。一切都有完全相同的结果,它在某些屏幕上有效,但在其他屏幕上无效。

这是我Switch放置在 a 中的小部件,LinearLayout其中 a 为2。每个水平中通常layout_weight有5 个小部件,但这个特定的小部件有 4 个,因为应该占用 2 个插槽。LinearLayoutSwitch

        <Switch
            android:id="@+id/btndegreerad"
            style="?android:attr/borderlessButtonStyle"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:background="@drawable/degree_rad_track"
            android:showText="true"
            android:switchTextAppearance="@style/SwitchTextTheme"
            android:textAppearance="@style/TextAppearance.AppCompat.Body1"
            android:textOff="@string/btnrad"
            android:textOn="@string/btndegree"
            android:thumb="@drawable/degree_rad_thumb"
            android:thumbTextPadding="@dimen/_3sdp"
            android:thumbTint="@color/colorSwitch"
            android:track="@drawable/degree_rad_track" />
Run Code Online (Sandbox Code Playgroud)

这是degree_rad_thumb可绘制的-

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="false">
        <shape android:shape="rectangle">
            <size android:height="@dimen/_38sdp" android:width="0dp"/>
            <corners android:bottomRightRadius="10dp"
                android:bottomLeftRadius="10dp"
                android:topRightRadius="10dp"
                android:topLeftRadius="10dp"/>
        </shape>
    </item>
    <item …
Run Code Online (Sandbox Code Playgroud)

xml android android-layout

5
推荐指数
1
解决办法
1493
查看次数

避免在 django allauth 的自定义用户模型中创建用户名字段

我正在使用带有 allauth 的自定义用户模型,并且需要省略用户名字段。我已经看过文档和一大堆关于使用的 stackoverflow 答案ACCOUNT_USER_MODEL_USERNAME_FIELD = None,但所有这些仍然导致我的数据库有一个用户名字段。

现在,由于数据库仍然有一个username设置了唯一约束的字段,并且allauth 不会在上述设置设置为 的字段中放置用户名,这导致我在第一个用户创建后None面临。IntegrityError我知道我可以通过设置上述设置来解决这个问题,'username'但我很好奇,我如何不创建用户名,因为我从不使用它。

我的型号:

class CustomUser(AbstractUser):
    # Custom user model for django-allauth
    first_name = None
    last_name = None

    def delete(self):
        # Custom delete - make sure user storage is also purged
        # Purge the user storage
        purge_userstore(self.email)
        # Call the original delete method to take care of everything else
        super(CustomUser, self).delete()

Run Code Online (Sandbox Code Playgroud)

除了覆盖该函数之外,它实际上并没有做太多事情delete。此覆盖与本主题无关,但我将其包含在内只是为了完整性。它还设置first_namelast_nameto None,它可以完美地工作并按预期从数据库中删除这些字段。我尝试过设置user …

python django django-allauth

3
推荐指数
1
解决办法
2657
查看次数