使用C中的指针扫描字符串

使用C中的指针扫描字符串,c,string,pointers,scanf,C,String,Pointers,Scanf,可能重复: 以下代码被认为是好代码吗?我不应该在什么地方用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吗?我能够编译这个,它工作了,但我觉得它不应该

#include <stdio.h>

int main (void) {

    char *name;

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

    return 0;
}
如果要修改名称,会发生什么?我该怎么做呢

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

name是一个指针,&name返回变量名的地址,因此scanf将您输入的名称放入指针本身

例如,如果输入ABC,则如果CPU为小端,指针将为0x00434241;如果CPU为大端,指针将为0x41434200,其中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是一个指针,&name返回变量名的地址,因此scanf将您输入的名称放入指针本身

例如,如果输入ABC,则如果CPU为小端,指针将为0x00434241;如果CPU为大端,指针将为0x41434200,其中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;
}

或者,您也可以使用gets,以避免在有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;
}

或者,您也可以使用gets,以避免在有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;
}


这是一个非常糟糕的代码。我建议您首先了解C语言中内存分配的工作原理。您使用的是未初始化的指针。1。不是复制品,我是另一张海报。类似的问题,但不一样。2.你对如何做有什么建议?我意识到这是错误的,但我似乎找不到好的解决方案。比使用未初始化指针更糟糕的是,您使用的是未初始化指针的地址。即使您分配了内存并将名称指向它,scanf和printf调用仍然是错误的。您应该使用定义的值初始化字符串,也可以使用get来避免标准输入buffer@LewsTherin这与这个问题毫无关系,这个问题是关于glibc特性%的,因为它会自动分配内存。凯尔,一个问题是否是重复的与问这个问题的人无关。这是一个非常糟糕的代码。我建议您首先了解C语言中内存分配的工作原理。您使用的是未初始化的指针。1。不是复制品,我是另一张海报。类似的问题,但不一样。2.你对如何做有什么建议?我意识到这是错误的,但我似乎找不到好的解决方案。比使用未初始化指针更糟糕的是,您使用的是未初始化指针的地址。即使您分配了内存并将名称指向它,scanf和printf调用仍然是错误的。您应该使用定义的值初始化字符串,也可以使用get来避免标准输入buffer@LewsTherin这与这个问题毫无关系,这个问题是关于glibc特性%的,因为它会自动分配内存。凯尔,一个问题是否是重复的与谁问的问题无关。这本来是我计划做的,但是定义名称数组会占用你不需要的空间吗?@凯尔:是的,最多256字节,取决于你输入的字符串的长度。@凯尔:你不知道名称需要多少内存,因此,分配足够的内存作为输入缓冲区。然后,您可以只动态分配实际需要的数量,将名称复制到其中,然后为下一次输入重用缓冲区。如果您想要更小的内存占用,请使用动态malloc。如果希望程序运行得更快,请使用预先调整大小的阵列。当你扫描到一个固定大小的缓冲区时,一定要给出一个最大大小以避免缓冲区溢出:scanf%255s,name;这本来是我计划要做的,但是为name定义数组会占用您不需要的空间吗?@kyle:是的,最多256字节,这取决于您输入的字符串长度。@kyle:您不知道名称需要多少内存,所以请分配足够的内存作为输入缓冲区。然后,您可以只动态分配实际需要的数量,将名称复制到其中,然后为下一次输入重用缓冲区。如果您想要更小的内存占用,请使用动态malloc。如果希望程序运行得更快,请使用预先调整大小的阵列。当你扫描到一个固定大小的缓冲区时,一定要给出一个最大大小以避免缓冲区溢出:scanf%255s,name;如果我想用指针呢?如果名称的长度仅为10
剩余的字符不是浪费空间导致效率下降吗?-1:永远不要使用get-使用fgets并指定字符的大小buffer@kyle:数组是指针。如果我想使用指针怎么办?如果name只有10个字符的长度,那么剩下的部分会不会浪费空间,导致效率下降?-1:从不使用get-使用fgets并指定buffer@kyle:数组是指针。