反向阵列(带argc和argv)和#x2B;如何打印

反向阵列(带argc和argv)和#x2B;如何打印,c,C,我是c语言的初学者,我想根据用户的输入,使用另一个动态分配的数组来切换argv数组的元素,但在将值(或字符)放入这个数组时,我遇到了一些问题,错误是:赋值从指针生成整数,而不使用cast[-Wint转换],我不明白这个问题。。。然后我想打印新的标签,但我不能,因为,我怎么做 #include <stdlib.h> #include <stdio.h> int main(int argc, char*argv[]) { /*TO BE CO

我是c语言的初学者,我想根据用户的输入,使用另一个动态分配的数组来切换argv数组的元素,但在将值(或字符)放入这个数组时,我遇到了一些问题,错误是:赋值从指针生成整数,而不使用cast[-Wint转换],我不明白这个问题。。。然后我想打印新的标签,但我不能,因为,我怎么做

    #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;
    }
#包括
#包括
int main(int argc,char*argv[]){
/*待完成*/
int*tab=malloc(argc*sizeof(char));
int i=0;
if(tab==NULL)
{
fprintf(stderr,“内存不足!\n”);
退出(退出失败);
}
printf(“tab=[”);
对于(i=argc;i>1;i--)
{
int k=0;
tab[k]=argv[i];
k+=1;
//printf(“%c”,制表符[k]);
}
printf(“]”);
免费(标签);
返回退出成功;
}
赋值从指针生成整数,无需强制转换[-Wint conversion]制表符[k]=argv[I]

您收到此警告是因为您已将
tab
声明为type
int*
argv
是一个
char*
数组,因此您将指针(同样,
char*
分配给整数数组中的一个条目

我试图分配一个包含argc元素(输入)并返回输入的新选项卡,但返回的却是相反的

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

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

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

有一些问题和误解需要解决:

  • tab
    应该声明为type
    char**
    而不是
    int*
    argv
    是一个类型为
    char**
    的二维数组,因此
    tab
    应该反映这一点。目前,您声明
    int*
    malloc
    作为指向
    char
    的内存块的指针,它是这是你犯错误的原因

  • k
    ,您用来跟踪您在
    选项卡
    数组中所处位置的索引,在反转循环的每次迭代中都会被重新声明并重置为
    0
    ,并且无法取得进展。它应该在循环范围内声明,而不是在循环块内声明

  • argv[0]
    是可执行文件的名称,因此您可能只想将
    argc-1
    元素从
    1..argc-1
    添加到
    选项卡
    数组中。您可以相应地调整
    malloc
    调用大小

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

  • printf
    将需要
    %s
    格式字符串而不是
    %c
    来打印
    argv
    /
    选项卡的每个元素,因为元素可能不止一个字符

  • 这里有一个可能的解决方案(我已将打印从反转循环中移出,以分离关注点):


    完整的错误消息是什么?我不明白您试图对
    argc
    执行的操作,它是一个整数,告诉您
    argv
    中有多少字符串。为什么要为
    argc
    字符分配块?它是:警告:赋值从指针生成整数,而不使用强制转换[-Wint conversion]选项卡[k]=argv[i];这不是完整的消息。它至少应该包括一个文件名和一个行号(任何错误消息中最重要的两个部分)。(与您的主要问题无关,但您应该在循环外声明
    k
    ,否则您将始终分配给
    选项卡[0]
    。在循环中,您尝试访问
    argv[argc]
    ,它超出了最后一个参数。)然后我想打印tab的元素,我不知道在其中使用哪些标志printf@MathisFuentes
    %s
    是字符串的printf格式说明符,我想这正是您想要的。printf格式字符串有很多选项,特别是对于数字类型,所以您应该随身携带。帮助没有com的初学者很好完整地解决问题,以便他们能够自己学习。谢谢,我遇到了另一个我也不理解的错误,我将尝试代码并从中学习:)我同意不解决问题让对方思考没问题,但我真的被卡住了,它确实帮助我看到了代码并分析了我的问题。谢谢你花了这么多时间!@Caleb你说得对,实际上添加副本会导致内存泄漏,而没有
    空闲
    ,所以我将其删除;只需草图d这是一个没有ASAN的突发奇想。值得注意的是,新数组是一个参考数组。至于你的链接,你确定这是一个家庭作业问题吗?双方都有很多假设,即使这是家庭作业,我觉得我的答案显然“有助于学生学习”并且“符合他们的兴趣”。有一些解决方案提供了大量完成的代码,没有任何解释,我觉得这里不是这样。对于DV假设,我深表歉意。
    
    #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;
    }