【问题标题】:Why this is not working? Strings in C. If always true. WHY?为什么这不起作用? C 中的字符串。如果始终为真。为什么?
【发布时间】:2014-01-11 22:22:19
【问题描述】:

请帮助我。 我不知道为什么这个程序不起作用。 抱歉,我需要发布整个代码,以便清楚地理解。

我尝试将 str 放入 txt 文件,然后再次读取它,这是同样的问题。 另外,我尝试用其他一些指针更改指针,然后对它们进行比较,以及 samo 问题。

程序的参数是:

1) txt 文件 - 类似这样的东西 - xyxxyyyxyxxyxyyxyxyxyyyyxxxx...

2) 数字 - 示例 - 2 - 表示我需要成对组合符号

输出应该是 x 和 y 的任意组合的概率(xx,yy,xy,yx - 2 组)。 示例:

p(xx)=0.4
p(yy)=0.1
p(yx)=0.5
p(xy)=0

但是! 这总是正确的:

 if (str==lista[i])

为什么? 我为此苦苦挣扎了好几个小时。 :(

我尝试了其他人的建议:

看看这个:

http://i.imgur.com/SL1L8hc.jpg
http://i.imgur.com/QwZGdgM.jpg

最奇怪的一个:

http://i.imgur.com/BIeLXOu.gif

完整代码:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

typedef char * string;

int main(int argc, char *argv[]){
if (argc<3) {
    return -1;
}

FILE *ul;
int mode,i,dane,j,razl;
char *str;
int brojac=0;
string lista[1000];
int   pomlis[1000];
ul=fopen(argv[1],"r");
fseek(ul,0,SEEK_SET);

if (!ul){
    return 1;
}
for (i=0;i<1000;i++){
    lista[i]="nist";
    pomlis[i]=0;
}
mode=atoi(argv[2]);
str=(char*)malloc(mode+1);
brojac=0;   
razl=0;

while (fgets(str,sizeof(char)*mode+1,ul)!=NULL){

    dane=0;
//  printf("%s ",str);  //da bi printao u konzolu

    brojac++;
    for (i=0;i<=razl;i++){  
        if (str==lista[i]){
            pomlis[i]++; 
            dane=1;
        }
    }

    if (dane==0){
        if (lista[i]=="nist") i--; 
        lista[i+1]=str; 
        pomlis[i+1]=1;
        razl++; 
    }
}
for (i=1;i<=razl;i++){
    printf("p(%s)=%f\n",lista[i],pomlis[i]/((double)brojac));
}

fclose(ul);

return 0;
}

我尝试了 cmets 中的所有建议,但没有任何效果。有谁知道答案吗?

【问题讨论】:

  • 如果你想比较字符串本身的相等性,你需要 strcmp
  • 已编辑。你知道if有什么问题吗?看看我添加的图片。
  • if 没有问题。您的调试是问题所在。

标签: c string file


【解决方案1】:

首先,sizeof(char) 定义为 1。它不会使代码更具可读性。

线

fgets(str,sizeof(char)*mode+1,ul);

读入分配的char *str

str=(char*)malloc(sizeof(char)*mode);

应该省略演员表,并且太小而无法容纳 fgets() 写入它的所有内容(通过 +1 '\0')。

另外:

printf("p(%s)=%d\n",lista[i],pomlis[i]/brojac);

pomolis[i] 和 brojac 都是整数,因此除法不会返回分数(浮点数/双精度数),而是再次返回整数(在您的程序中很可能为零)。

谢谢大家,编辑了,但是,我能得到答案吗?如果没有人知道答案,为什么我会在问题上得到减分?

嗯,换行试试

   if (str==lista[i]){

if (!strncmp(str, &lista[i], mode){

并删除该行

fgets(str,sizeof(char)*mode+1,ul); 

在while循环体中(你已经在while条件下调用了fgets(),不要调用两次)

【讨论】:

  • First of, sizeof(char) is 1 by definition。不它不是。 charAt least 1 byte。在某些系统上,尽管可能很奇怪,char 是 2 个字节。
  • 是的,char 可能包含超过 8 位。尽管如此,sizeof(char) 仍然是 1。它是另一个 sizeof(data type) 必须改变的。
  • am.. 我应该尊重你的回复吗?如果数据是 2 字节宽,sizeof 将为 2。
  • @bolov sizeof(char) 定义为 1
  • 好吧,有两个人告诉我这个,所以我可能是错的。你能在标准中找到它说这个的地方吗?
【解决方案2】:

您的代码有很多问题。我建议阅读指针、内存分配以及字符串在 c 中的工作方式。由于您的typedef char * string,我想您一定来自比c更高的语言。忘记那些知识,如果你试图在这里应用它,你会遇到很大的问题。

我已经让它工作了,但我不会在这里发布工作代码,因为我对做任何人的作业都不感兴趣。我会试着教你你的问题是什么。

你的第一个问题在这里:

for (i=0;i<1000;i++){
    lista[i]="nist";
    pomlis[i]=0;
}

"nist" 分配给char * 会将常量字符串"nist" 的地址分配给指针。由于字符串是恒定的,如果您稍后尝试更改其中的某些内容,您将失败。

您应该使用malloc,它分配您可以写入的内存:

for (i=0;i<1000;i++){
    lista[i]=(char*) malloc(5);
    pomlis[i]=0;
}

接下来,正如其他人所解释的,使用== 与使用strncmp 完全不同。你应该使用:

if (strcmp(str, lista[i])==0){
    pomlis[i]++;
    dane=1;
} 

下一部分完全没有意义:

if (dane==0){
    if (lista[i]=="nist") i--; 
    lista[i+1]=str; 
    pomlis[i+1]=1;
    razl++; 
}

首先,您将与另一个指向常量字符串的指针进行比较(请注意,您已初始化的 "nist" 不必与您在此处的 "nist" 相同)。我真的不知道你在这里使用i 想要完成什么。

我是这样写的:

if (dane==0){
    memcpy(lista[razl],str, sizeof(str));
    pomlis[razl]=1;
    razl++;
}

试着理解这一点。

最后,您的for 循环达到了极限i&lt;=razl。由于数组初始化为零,您应该在i 命中razl 之前中断。

【讨论】:

  • 我知道memcpy是做什么的,但是没有它可以吗?
  • 另外,你能看看第二张图片,告诉我那里发生了什么吗?
【解决方案3】:
if (str==lista[i])

现在,strlista[i] 的类型为 char*。那就是它们是指针。在这种情况下,== 运算符会测试指针地址是否相等。因此,如果 == 运算符的计算结果为 true,则两个指针具有相同的地址。

如果要比较字符串的值,则必须使用strcmp()

【讨论】:

  • 您的代码还有许多其他问题,但我现在没有精力来涵盖所有问题。我认为这回答了您提出的问题。
  • 没有骰子。当我在 if 中打印它们时它们不同但它进入了 if。
  • 如果 == 的计算结果为 true,则两个指针具有相同的值。即变量strlista[i] 包含相同的地址。
  • 嗯,如果它们的地址比较相等,它们的内容也一样,不是吗?所以更改为strcmp 不会有太大变化。
  • 我试过strcmp,还是一样。但是我在 if 中添加了这个: printf("%s-%s ",str,lista[i]);它打印例如:xx-nist
猜你喜欢
  • 2013-03-03
  • 2012-11-30
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2021-09-09
相关资源
最近更新 更多