使用scanf和指针数组

使用scanf和指针数组,c,C,这会使指针指向内存中的随机位置还是使用起来安全?char*username[30]是指针数组,而不是字符。因此,您的代码是非常错误的(如在不安全中)。要获取字符数组,您需要: char* username[30]; memset(username,0x00,30); scanf("%s",&username); char*username[30]是指针数组,而不是字符数组。因此,您的代码是非常错误的(如在不安全中)。要获取字符数组,您需要: char* username[30]; me

这会使指针指向内存中的随机位置还是使用起来安全?

char*username[30]
是指针数组,而不是字符。因此,您的代码是非常错误的(如在不安全中)。要获取字符数组,您需要:

char* username[30];
memset(username,0x00,30);
scanf("%s",&username);

char*username[30]
是指针数组,而不是字符数组。因此,您的代码是非常错误的(如在不安全中)。要获取字符数组,您需要:

char* username[30];
memset(username,0x00,30);
scanf("%s",&username);
@佩雷尔,样本补充

char* username[30]; //is array of char pointers.

//Allocate memory for these pointers using calloc(). so no need of memset().  

memset(username,0x00,30);//can be removed.

scanf("%s",&username);//It should be scanf("%s",username[i]);
够了

@佩雷尔,样本补充

char* username[30]; //is array of char pointers.

//Allocate memory for these pointers using calloc(). so no need of memset().  

memset(username,0x00,30);//can be removed.

scanf("%s",&username);//It should be scanf("%s",username[i]);
足够了。

char username[30];
memset(username,0x00,30);
scanf("%s",username);
您正在初始化指针数组的前30个字节,而不是整个数组

memset(username,0x00,30);  
将所有内容设置为0,尽管简单循环对读者来说更清晰(IMHO)

scanf不会神奇地分配任何东西--“username”是指针数组,是空指针,scanf应该如何分配内存等?而是执行一个循环,让用户输入一个字符串,为该字符串分配内存(+1),将该字符串复制到分配的内存中,并将其分配给“username[i]”

char username[30];
memset(username,0x00,30);
scanf("%s",username);
您正在初始化指针数组的前30个字节,而不是整个数组

memset(username,0x00,30);  
将所有内容设置为0,尽管简单循环对读者来说更清晰(IMHO)


scanf不会神奇地分配任何东西--“username”是指针数组,是空指针,scanf应该如何分配内存等?而是执行一个循环,让用户输入一个字符串,为该字符串分配内存(+1),将该字符串复制到分配的内存中,并将其分配给“username[i]”。

您可能需要的是:

scanf("%s",&username);
尽管正如其他人所建议的,scanf()并不是读取“用户生成的输入”的最佳函数,但对于您的程序已经“检查”过的数据(即,它不包含“有趣的东西”、符合提供的长度等)并[使用fscanf()]写入文件,scanf()也可以。对于用户输入,请使用
fgets()
读取一行文本,然后以任何适合的方式对其进行处理,以从字符串中获取实际数据


例如,如果某个用户名的字符数超过100个[在上一个示例中为30个],则字符串将溢出,并且不会产生任何好结果[在非常糟糕的情况下,您将在很久以后才注意到,这使得调试变得很困难-如果您幸运,它会立即崩溃]。

您可能想要的是:

scanf("%s",&username);
char username[30] = {0};    // Same as memset, but shorter to write!
scanf("%s", username);
尽管正如其他人所建议的,scanf()并不是读取“用户生成的输入”的最佳函数,但对于您的程序已经“检查”过的数据(即,它不包含“有趣的东西”、符合提供的长度等)并[使用fscanf()]写入文件,scanf()也可以。对于用户输入,请使用
fgets()
读取一行文本,然后以任何适合的方式对其进行处理,以从字符串中获取实际数据

例如,如果某个用户名的字符数超过100个[在上一个示例中为30个],则字符串将溢出,并且不会产生任何好结果[在非常糟糕的情况下,您会在很久以后才注意到,这使得调试变得很困难-如果幸运的话,它会立即崩溃]

char username[30] = {0};    // Same as memset, but shorter to write!
scanf("%s", username);
上面的代码将崩溃,因为您正试图输入未分配内存的指针。首先为指针分配内存,然后读入该内存位置

char* username[30];
memset(username,0x00,30);
scanf("%s",&username);
上面的代码将崩溃,因为您正试图输入未分配内存的指针。首先为指针分配内存,然后读入该内存位置

char* username[30];
memset(username,0x00,30);
scanf("%s",&username);
这是指向字符的指针数组

选择
char用户名[30]

这是指向字符的指针数组


查找
char username[30]

您想做什么?除了语法问题之外,
scanf()
非常不适合做任何事情,而不是读取以前由您自己的程序编写的数据。甚至可能不是这样,因为
scanf()
提供了非常糟糕的错误处理。您想做什么?除了语法问题之外,
scanf()
非常不适合做任何事情,而不是读取以前由您自己的程序编写的数据。甚至可能不是这样,因为
scanf()
提供了非常糟糕的错误处理。所有方面都有非常好的建议,特别是摆脱
malloc()
。我对“malloc”有一个轻微的偏好,所以如果可能的话,我会尽量避免……;)非常全面的建议,特别是摆脱
malloc()
。我对“malloc”有轻微的偏好,所以如果可能的话,我尽量避免使用它……)