反向数组(带有argc和argv)+如何打印

时间:2018-10-20 18:24:17

标签: c

我是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;
    }

2 个答案:

答案 0 :(得分:2)

  

赋值从指针生成整数,而没有强制转换[-Wint-conversion]选项卡[k] = argv [I];

之所以收到此警告,是因为您已将tab声明为类型int *argvchar *的数组,因此您要分配一个指针(同样,char *指向整数数组中的条目。

  

im试图分配一个包含argc元素(输入)的新标签并返回输入,但相反

好的,但是您的代码实际上正在做的是:

int *tab =malloc(argc*sizeof(char));

用英语:分配一个大小为argc * 1的块,并将其地址分配给一个指针,该指针被键入为整数指针。听起来您的意思是创建一个字符指针数组,即malloc(argc * sizeof(char*)),但是如果您这样做,那么tab也应该键入为char **

答案 1 :(得分:-1)

有一些问题和误解可以解决:

  1. tab应该声明为类型char **而不是int *argv是类型char **的二维数组,因此tab应该对此进行镜像。就目前而言,您声明int *,但声明malloc指向指向char的存储块的指针,这是导致错误的原因。

  2. 重新声明
  3. k(用于跟踪tab数组中的位置的索引),并在每个索引上将其重置为0反向循环的迭代,无法取得进展。应该在循环作用域而不是循环块内部声明它。

  4. argv[0]是可执行文件的名称,因此您可能只想将argc - 1中的1 .. argc - 1个元素添加到tab数组中。您可以相应地调整malloc通话大小。

  5. 在循环中,设置i = argc超出了argv的数组范围;将其指向i = argc - 1以访问argv中的最后一个元素。

  6. 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, ]