5

此代码将向量(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));
}
4

2 回答 2

2

它在 cygwin 上编译得很好,并且puts可以接收一个 char 指针。
我看到的问题是您正在strcat使用指向单个字符的指针进行操作。

strcat(a, &space);

工作方式strcat是从一个字符串复制到另一个字符串,直到找到一个终止空字符('\0'),如果你不提供一个字符串,可能会发生奇怪的事情,为此更改它:

strcat(a, " ");
于 2012-11-22T18:39:11.057 回答
0

1) 首先

for(i = 0; str[i] != '\0'; )

这是错误的,因为 str[i] 是地址而不是字符,因此您必须与 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';
于 2012-11-22T18:36:35.477 回答