此代码将矢量(argv)转换为字符串,然后打印它。但是,如果从库(my_vect2str)调用vect2str,它会发出警告:
warning: passing argument 1 of ‘puts’ makes pointer from integer without a cast
跑步时的段错误。这里的函数vect2str与库中的函数(my_vect2str)完全相同。该库是在同一台计算机上编译的。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "../lib/my.h"
char *vect2str(char **str) {
if (str == NULL)
return NULL;
if (*str == NULL)
return NULL;
int num = 0;
char * a;
int i;
for(i = 0; str[i] != '\0'; )
num += strlen(str[i++]);
num += i;
a = (char *) xmalloc(num * sizeof(char));
//Make new string
char space = ' ';
char *end = "";
int j;
for(j = 0; str[j] != NULL; j++) {
strcat(a, str[j]);
strcat(a, &space);
}
strcat(a, end);
return a;
}
int main(int argc, char **argv) {
puts(vect2str(argv));
//This does not work
//puts(my_vect2str(argv));
}
答案 0 :(得分:2)
它在cygwin上编译得很好,而puts
收到一个字符指针就好了
我看到的问题是你正在使用指向单个字符的指针strcat
。
strcat(a, &space);
strcat
的工作方式是从一个字符串复制到另一个字符串,直到找到一个终止空字符('\ 0'),如果你不提供一个字符串,可能会发生奇怪的事情,改变为此:
strcat(a, " ");
答案 1 :(得分:0)
1)首先
for(i = 0; str[i] != '\0'; )
这是错误的,因为str [i]是一个地址而不是char,所以你必须比较一个NULL地址而不是一个空字符。在这之后怎么做
for(i = 0; str[i] != NULL; )
2)第二 将空间定义如下
char space = " ";
然后
strcat(a, space);
而不是
strcat(a, &space);
3)我不知道xmalloc()
是否将分配的内存设置为0.如果不是,则必须将a
数组中的第一个元素设置为'\0'
。
a = (char *) xmalloc(num * sizeof(char));
a[0] = '\0';