【问题标题】:Scanning in a string using pointers in C [duplicate]使用 C 中的指针扫描字符串 [重复]
【发布时间】:2012-11-06 23:39:09
【问题描述】:

可能重复:
Dynamic String Input - using scanf(“%as”)
strcmp with pointers not working in C

以下被认为是好的代码吗?我不应该在某处使用 malloc 吗?我能够编译它并且它工作,但我觉得它不应该。

#include <stdio.h>

int main (void) {

    char *name;

    printf("Whats your name? ");
    scanf("%s", &name);
    printf("\nyour name is %s", &name);

    return 0;
}

如果我想修改名称会怎样?我该怎么做呢?

编辑:我真的只是在寻找使用指针的最有效和正确的方法。我假设 malloc 是必要的。

【问题讨论】:

  • 这是一个非常糟糕的代码。我建议您首先了解 C 中内存分配的工作原理。您使用的是未初始化的指针。
  • 1.不是重复的,我是另一张海报。类似的问题,但不一样。 2. 你对如何做有什么建议?我意识到这是错误的,但我似乎找不到好的解决方案。
  • 比使用未初始化的指针更糟糕的是,您使用的是未初始化指针的地址。即使您分配了内存并将name 指向它,在scanf()printf() 调用上仍然是错误的。
  • 你应该用一个定义的值初始化一个字符串,你也可以使用gets()来避免标准输入缓冲区
  • @LewsTherin 这与那个问题完全没有关系,这是关于自动分配内存的 glibc 功能(%as)。凯尔,一个问题是否重复与是谁提出的无关。

标签: c string pointers scanf


【解决方案1】:

name是一个指针,&amp;name返回变量name的地址,所以scanf就是把你输入的名字放到指针本身。

例如,如果您输入ABC,则指针将为 0x00434241(如果 CPU 是 little-endian)或 0x41434200(如果 CPU 是 big-endian),其中 0x41 是“A”的字符代码, 0x42 是 'B' 等的字符代码。

您应该分配可以存储输入名称的内存,然后将指向它的指针传递给scanf

这是一个在堆栈上分配的示例:

#include <stdio.h>

#define MAX_NAME_LENGTH 256

int main (void) {

    char name[MAX_NAME_LENGTH];

    printf("Whats your name? ");
    scanf("%s", name);
    printf("\nyour name is %s", name);

    return 0;
}

【讨论】:

  • 这本来是我打算做的,但是会为name定义数组,占用你不需要的空间?
  • @kyle:是的,最多 256 个字节,具体取决于您输入的字符串的长度。
  • @kyle:你不知道这个名字需要多少内存,所以分配很多作为输入缓冲区。然后,您可以只动态分配实际需要的数量,将名称复制到其中,然后将缓冲区重新用于下一个输入。
  • 如果您想要更小的内存占用,请使用动态 malloc。如果您希望程序运行得更快,请使用预先确定大小的数组。你可以只使用数组作为指针。
  • 当你扫描到一个固定大小的缓冲区时,总是给一个最大的大小以避免缓冲区溢出:scanf("%255s", name);
【解决方案2】:

或者,您也可以使用获取,以避免在您有超过 2 个连续输入的情况下使用标准输入缓冲区。

#include <stdio.h>

#define LENGTH 256

int main (void) {

   char name[LENGTH];

   printf( "Whats your name? " );
   fgets( name, sizeof( name ), stdin );
   printf( "\nYour name is %s", name );

   return 0;
}

【讨论】:

  • 如果我想使用指针怎么办?如果name只有10个字符的长度,其余的会不会浪费空间导致效率下降?
  • -1:永远不要使用gets -- 使用fgets并指定缓冲区的大小
  • @kyle:数组是指针。
猜你喜欢
  • 2016-10-21
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 2016-03-24
  • 1970-01-01
  • 2012-10-14
  • 2016-04-19
相关资源
最近更新 更多