为什么这段代码不起作用? 我一直在尝试做的是使用int main(int ac, char ** ac)
和malloc()
为数组的未知用户输入长度进行动态分配。
#include <stdio.h>
#include <stdlib.h>
int main(int ac, char **av)
{
char *str;
int i;
str = malloc(sizeof(char) * (ac + 1));
i = 0;
if(str[i] != ' ')
{
i = i + 1;
printf("%snt", str);
}
return(0);
}
- 以标准化的方式命名 main(( 的参数:
int argc, char *argv[]
。 - (请注意,可执行文件的名称
argv[0]
,您可能感兴趣,也可能不感兴趣( - 首先,您需要为字符分配
argc
数量的指针。如果对您的程序有意义,可以选择在末尾使用 NULL 哨兵值 - 不过不要将其与 null 终止混淆。 - 所以你应该有类似的东西
char** str_table = malloc(sizeof(*str_table) * argc);
- 对于
str_table
中的每个项目,为strlen(argv[i]) + 1
字符分配额外的内存,即实际数据。在这种情况下,+1 用于空终止,并且是强制性的。 - 从
argv[i]
strcpy
到您自己的阵列。
ac不是任何参数的长度,而是参数计数。 当用户指定一个参数时,此参数将始终为 2。
如果程序应该只输出第一个参数,你可以这样做:
#include <stdio.h>
int main(int argc, char **argv) {
if(argc == 2)
printf("%sn", argv[1]);
return 0;
}
如果你想将参数加载到一个字符串中,你必须得到它的长度。 例如,这可以通过 strlen(( 函数来完成:
#include <stdio.h> /* for printf */
#include <stdlib.h> /* for malloc and free */
#include <string.h> /* for strlen and strcpy */
int main(int argc, char **argv) {
if(argc == 2) {
char *input_string;
int input_string_length;
input_string_length = strlen(argv[1]);
/* strlen() does not include the ' ' in the length */
input_string = malloc((input_string_length + 1) * sizeof(char));
strcpy(input_string, argv[1]);
printf("%sn", input_string);
free(input_string);
}
return 0;
}
ac
不代表用户输入长度(因为您一直在尝试为ac+1
分配内存(+str
指向没有任何有效数据的原始内存位置,即使你想使用ac
,那么:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //added for memset
int main(int ac, char **av)
{
char *str;
int i; //USELESS
str = malloc(sizeof(char) * (ac + 1)); //str points to a memory (if allocated) which contains garbage
i = 0; //NO USE
if(str) //checks if memory has been allocated - NO INCREMENT NEEDED OR VALID
{
printf("Memory has been successfully allocated");
memset(str,' ',ac+1); //added for NULL termination
}
return(0);
}
如果您尝试在堆栈上分配内存,您也可以寻找 VLA。
此语句
str = malloc(sizeof(char) * (ac + 1));
没有意义。
此外,分配的数组未初始化。所以这个说法
if(str[i] != ' ')
导致未定义的行为。
似乎您要做的是通过在动态分配的数组中复制命令行参数来输出它们。
如果是这样,那么程序可以如下所示
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main( int argc, char * argv[] )
{
if ( argc > 1 )
{
char **s = malloc( ( argc - 1 ) * sizeof( char *) );
for ( int i = 0; i < argc - 1; i++ )
{
s[i] = malloc( strlen( argv[i+1] ) + 1 );
strcpy( s[i], argv[i+1] );
}
for ( int i = 0; i < argc - 1; i++ )
{
puts( s[i] );
}
for ( int i = 0; i < argc - 1; i++ ) free( s[i] );
free( s );
}
return 0;
}
如果像这样运行程序
program Hello World
然后输出将是
Hello
World
您可以将自己的检查添加到程序中,检查内存分配是否成功。
代码中存在一些逻辑错误。
int ac
是参数的数量。char **av
包含参数。
例如:./program arg1 arg2
av[0]
将是"./program">av[1]
将是"arg1">av[2]
将是"arg2">av[2][0]
将是"a">
现在,如果你只想要第一个参数的大小,你可以使用 strlen(( :int size = strlen(av[1]);
你需要的而不是你的if语句是一个while循环来遍历av的所有元素。 例如:
int i = 0;
while (i <= ac) {
printf("%s", av[i]);
...Your code...
i++;
}