【问题标题】:How to get all characters including null characters('\0') from character pointer in C?如何从C中的字符指针获取所有字符,包括空字符('\ 0')?
【发布时间】:2022-01-09 23:16:04
【问题描述】:

我有字符指针输入并为其设置了 50 字节的内存。在我使用 scanf 从键盘输入后,例如“apple”,然后我假设剩余的空格用空字符填充。如果是这样,我如何获取所有字符或内存位置,包括空字符的位置。有什么办法吗?

int main() {
    char *input;
    int size;

    input = (char *)malloc(50);
    printf("%s\n", "enter something:");
    scanf("%s", input);

    size = strlen(input) + 1;

【问题讨论】:

  • 你不能使用scanf,至少没有用处。你无法知道它读了多少,这是需要的。可以使用freadread
  • 什么是“获取”?把他们带到哪里? “我假设剩余的空格用空字符填充” - 是一个不正确的假设。您只能在字符串末尾假设 一个 空字符。
  • 请注意scanf("%s", input); 容易受到内存溢出的影响。如果用户输入 50 个或更多字符,您将进入未定义的行为领域。这可以并且已经被用于邪恶目的。正是as dangerous as gets()
  • then i assume that remaining spaces are filled with null character.。这个假设是无效的。
  • 那么如果字符串末尾只有一个字符填充了空字符,那么其他空格是否填充了垃圾值?

标签: c pointers memory malloc null-character


【解决方案1】:

字符串操作函数作用于字符串。如果您想将字符数组视为字符数组而不是字符串,只需避免使用字符串函数(通常是那些名为 str* 的函数)。例如:

#include <stdio.h>

int
main(int argc, char **argv)
{
    char input[50] = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw";
    printf("%s\n", "enter something:");
    if( 1 == scanf("%49s", input)) {
        fwrite(input, sizeof(char), sizeof input, stdout);
        putchar('\n');
    }
    return 0;
}

请注意,如果您希望查看此数据,则可能无法很好地呈现不可打印的字符。特别是在终端查看数据时,scanf写入的空字符可能会引起一些混乱。 YMMV。

【讨论】:

    【解决方案2】:

    或例如“apple”然后我假设剩余的空间被填充 空字符

    你的假设是错误的。数组中的所有其他元素都具有破坏值。

    如何获取所有字符或内存位置,包括位置 空字符。有什么办法吗?

    您不能使用任何字符串函数访问空字符以外的字符。但是您可以将它们作为数组的“普通”元素访问

    int main() {
        char *input;
        int size;
    
        input = (char *)malloc(50);
        printf("%s\n", "enter something:");
        scanf("%s", input);
    
        for(size_t i = 0; i < 50; i++)
        {
            printf("Char no [%zu] is 0x%02x = %s\n", i, input[i], (input[i] >= ' ' && input[i] < 127) ? (char[]){'\'', input[i], '\'', 0} : "not printable");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-07
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      相关资源
      最近更新 更多