【问题标题】:String pointer issue in C codeC代码中的字符串指针问题
【发布时间】:2013-01-04 00:07:36
【问题描述】:

这个 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;
}
/*----------------------------------------------------------------------------*/

【问题讨论】:

  • 指针算法很有趣,但常规索引往往会使此类代码更具可读性。

标签: c


【解决方案1】:
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);

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

【讨论】:

  • 记住;之后,您必须自己释放strdupmalloc 分配的内存。
  • 我可以通过电子邮件询问与此事有关的事情吗
  • @maziarparsaeian 我宁愿把它放在网站上。这是关于什么的?
  • 这是另一个类似的解决方案,没有重复,但我不明白
  • 这是我电脑上的一位朋友写的,这就是为什么
【解决方案2】:
Ind_w[i] = strdup(w);//the issue is here!!

每次读取缓冲区时都必须复制w 缓冲区,并且不要对所有读取使用相同的缓冲区。使用您的方式,您将拥有指向同一个缓冲区的所有数组元素,并且该缓冲区包含相同的字符串,这是使用sscanf 读取的最后一个字符串。

注意:你必须free所有重复的缓冲区,当它们变得无用时。您可以通过遍历指针数组并释放每个元素(指针)来做到这一点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多