我是c语言的初学者,我想使用另一个动态分配的数组根据用户的输入切换argv数组的元素,但是在将值(或char)放入此数组时,我遇到了问题数组,错误是:assignment从没有转换[-Wint-conversion]的指针中使整数,并且我没有得到问题...然后我想打印新的选项卡,但是我不能,因为,我该怎么做?
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char*argv[]) {
/*TO BE COMPLETED*/
int *tab =malloc(argc*sizeof(char));
int i = 0;
if (tab == NULL)
{
fprintf(stderr, "Not enough memory!\n");
exit (EXIT_FAILURE);
}
printf("tab = [");
for (i = argc; i > 1; i--)
{
int k = 0;
tab[k] = argv[i];
k +=1;
//printf(" %c," tab[k]);
}
printf(" ]");
free(tab);
return EXIT_SUCCESS;
}
答案 0 :(得分:2)
赋值从指针生成整数,而没有强制转换[-Wint-conversion]选项卡[k] = argv [I];
之所以收到此警告,是因为您已将tab
声明为类型int *
。 argv
是char *
的数组,因此您要分配一个指针(同样,char *
指向整数数组中的条目。
im试图分配一个包含argc元素(输入)的新标签并返回输入,但相反
好的,但是您的代码实际上正在做的是:
int *tab =malloc(argc*sizeof(char));
用英语:分配一个大小为argc * 1
的块,并将其地址分配给一个指针,该指针被键入为整数指针。听起来您的意思是创建一个字符指针数组,即malloc(argc * sizeof(char*))
,但是如果您这样做,那么tab
也应该键入为char **
。
答案 1 :(得分:-1)
有一些问题和误解可以解决:
tab
应该声明为类型char **
而不是int *
。 argv
是类型char **
的二维数组,因此tab
应该对此进行镜像。就目前而言,您声明int *
,但声明malloc
指向指向char
的存储块的指针,这是导致错误的原因。
k
(用于跟踪tab
数组中的位置的索引),并在每个索引上将其重置为0
反向循环的迭代,无法取得进展。应该在循环作用域而不是循环块内部声明它。
argv[0]
是可执行文件的名称,因此您可能只想将argc - 1
中的1 .. argc - 1
个元素添加到tab
数组中。您可以相应地调整malloc
通话大小。
在循环中,设置i = argc
超出了argv
的数组范围;将其指向i = argc - 1
以访问argv
中的最后一个元素。
printf
将需要%s
格式的字符串而不是%c
来打印argv
/ tab
的每个元素,因为元素可能比一个字符。
这是一种可能的解决方案(我已将打印移到反转循环之外以分离问题):
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
int i, j;
char **tab = malloc((argc - 1) * sizeof(*tab));
if (tab == NULL) {
fprintf(stderr, "Not enough memory!\n");
exit(EXIT_FAILURE);
}
for (i = 1, j = argc - 2; i < argc; i++, j--) {
tab[j] = argv[i];
}
printf("tab = [");
for (i = 0; i < argc - 1; i++) {
printf(" %s,", tab[i]);
}
puts(" ]");
free(tab);
return EXIT_SUCCESS;
}
输出:
$ ./a.exe a b c d e f g h
tab = [ h, g, f, e, d, c, b, a, ]