C代码中的字符串指针问题

该C程序从键盘读取一行文本,然后将最长的单词写入该行。我的代码下面的问题是,它只打印最后一个字,除了它的长度,尽管一切似乎都很好。任何人都可以看到我的代码有问题吗?C代码中的字符串指针问题

#include<stdio.h> 

#include<string.h>

#define MAX 132

#define MAXW 30

int Len_w[MAXW];

int Max_V(int vf[], int len);

main()

{

char s[MAX+1], w[MAXW], *Ind_w[MAXW],*p,out[MAXW];

int k=0, i=0, Maximum, g=0;

printf("\nInsert the line....\n");

p=fgets(s, MAX, stdin);

while(sscanf(p, "%s%n", w, &k)==1){

Len_w[i] = strlen(w);

Ind_w[i] = w; //the issue is here!!

p+=k+1;

i++;

}

Maximum = Max_V(Len_w,i);

for(g=0;g<i;g++){

if(Len_w[g] == Maximum){

//sscanf(Ind_w[g],"%s",out);

printf("\n%s", Ind_w[g]);

}

}

return 0;

}

/*----------------------------------------------------------------------------*/

int Max_V(int vf[], int len)

{

int j; int Max;

Max=*vf;

for(j=1; j < len; j++)

{

if(*(vf+j) > Max)

{

Max=*(vf + j);

}

}

return Max;

}

/*----------------------------------------------------------------------------*/

回答:

Ind_w[i] = w;//the issue is here!! 

你让Ind_w点都指向同一个缓冲区,每个进入字就被覆盖。所以只有最后输入的单词保持“可见”。

如果你拥有了它,

Ind_w[i] = strdup(w); 

是一个简单的解决方案。否则

Ind_w[i] = malloc(strlen(w)+1); 

strcpy(Ind_w[i], w);

两种方式都需要它时不再使用被释放指向的内存。

回答:

Ind_w[i] = strdup(w);//the issue is here!! 

你要复制每次读取缓冲区,而不是使用相同的缓冲区所有的阅读时间w缓冲。用你的方式,你将有全部指向同一个缓冲区中的数组元素,并且该缓冲区包含这是最后一个读与sscanf

注相同的字符串:你必须free所有的重复时的缓冲区他们来无用。你可以通过遍历指针数组并释放每个元素(指针)

以上是 C代码中的字符串指针问题 的全部内容, 来源链接: utcz.com/qa/258289.html

回到顶部