【问题标题】:What am I doing wrong with this array in C?我在 C 中对这个数组做错了什么?
【发布时间】:2018-03-07 03:45:16
【问题描述】:

我需要知道“Maria”在这个数组中出现了多少次,但是当我运行它时,它说它出现了 51 次,我认为它只有 8 次

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int g;
    int i;
    const char * nombres[40] = {"Sandra Marisol","Juan Luis","Perez Luis","Carlitos","Maria","Mariana", "Carlota","Anthony",
                        "Fernando Jan","Alfonso Roche","Julieta Zacatenco","Maria de los Angeles","Laura Jessica",
                        "Andrea Maria","Jose Maria","Andres Molina","Aline Derrant","Paquito","Luisa","Ana Maria",
                        "Caleb","Luis Fernando","Mario Alberto","Paula Monica","Otoniel","Elias Primero","Maurico Enrique",
                        "Anastasia Maria","Maria Juana","Juana de Arco","Aria Montgomery""Hanna Maria","Magdalena","David Green",
                        "Florian Drake","Edward Jones","Joakin Broder","Paar","Alicia Torres","Juan Pablo"};
    for(i = 0; i>40; i++)
    {
        printf("%s\n", nombres[40]);
        if(nombres[i] == "Maria")
        g++;
    }
    if(g>0){
            printf("El nombre de Maria aparece %d veces.", g);
        }
        else {
            printf("El nombre de Maria NO aparece");
        }

    system("pause");
    return 0;

}

【问题讨论】:

  • 请贴出代码,而不是代码的图片。如果有人想帮助你并且答案不明显,他们必须自己重新输入整个程序。
  • 代码图像绝对没用,整个桌面的图片也是如此。请参阅this Meta post,了解您应该避免发布图片的众多原因列表。代码和错误以文本形式出现,应按原样发布。当您在此处创建帐户时,建议您使用 tour 并阅读 help center 页面以熟悉此站点。请这样做,尤其是 How to Askminimal reproducible example,然后在此处发布您的下一个问题。
  • 对不起,我已经编辑过了
  • 仔细查看你对g的使用。如果这没有帮助,请使用调试器单步执行代码,观察 g 的值。
  • 好的。再来一个提示。在for 循环之前打印出g 的值。这是你所期望的吗?如果这没有帮助,请回去向您的老师寻求帮助,因为您在课堂上错过了一些东西。

标签: c


【解决方案1】:

if(nombres[i] == "Maria")

你不能像这样比较字符串。您需要使用strstr() 在字符串中查找子字符串。

另外, printf("%s\n", nombres[40]); 可能应该有 i 而不是 40。而你在上面的 for 循环中间的比较是倒退的。

而且...可能还有其他错误,但这对我来说已经足够了。

【讨论】:

  • 发布的代码中存在比这更大的问题。不投票,只评论。您指出的内容不会产生海报所描述的问题。
  • 同意。它加载了错误。 g 显然只是得到了该堆栈位置发生的任何事情,因为它没有被初始化并且永远不会进入 for 循环。
【解决方案2】:

有很多错误.....让我们看看我能解决多少..xd

 #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main(int argc, char *argv[])
    {
        int g=0;
        int i;
        const char * nombres[40] = {"Sandra Marisol","Juan Luis","Perez Luis","Carlitos","Maria","Mariana", "Carlota","Anthony",
                            "Fernando Jan","Alfonso Roche","Julieta Zacatenco","Maria de los Angeles","Laura Jessica",
                            "Andrea Maria","Jose Maria","Andres Molina","Aline Derrant","Paquito","Luisa","Ana Maria",
                            "Caleb","Luis Fernando","Mario Alberto","Paula Monica","Otoniel","Elias Primero","Maurico Enrique",
                            "Anastasia Maria","Maria Juana","Juana de Arco","Aria Montgomery""Hanna Maria","Magdalena","David Green",
                            "Florian Drake","Edward Jones","Joakin Broder","Paar","Alicia Torres","Juan Pablo"};
        for(i = 0; i<40; i++)
        {
            printf("%s\n", nombres[i]);
            if(!strcmp(nombres[i],"Maria"))
            g++;
        }
        if(g>0){
                printf("El nombre de Maria aparece %d veces.", g);
            }
            else {
                printf("El nombre de Maria NO aparece");
            }

        return 0;

    }

这里的计数器变量 g 没有被初始化。它应该初始化为 0,否则它包含一些垃圾值。然后在 for 循环中条件错误,循环没有被执行,因为你在这里写 I>40,我被初始化为 0,所以条件为假并且循环不运行。然后循环中的 printf 包含 nombres[40] ,它给出了一个空指针,因为你的姓氏是 hombres[39]。然后在 if 条件下,你不能像其他变量一样只比较字符串,你必须使用 lib 函数,它是 strcmp 表示字符串比较。 在以下情况下

strcmp(s1,s2);

**

*if s1==s2 then it returns 0.
If s1>s2 then it returns 1
If s1<s2 it returns -1 

所以我写了!strcmp(); 所以如果字符串匹配,它将返回 0 和 '!'将其转换为 1。 希望这可行。荣誉。

【讨论】:

  • OP 不会通过你修复他的代码来学习。试着解释什么是错误的,以及如何解决它。
  • 这是我在这里的第二个答案,对不起,现在我已经简要解释了代码错误和错误
  • 简要解释了提问者疯狂的错误代码。因为这是我在这里的第二个答案,对此感到抱歉,但有时你不会明白你只需要答案
  • @harald 现在请看它并提供更多建议
  • 它更好,但有点难以理解。我的建议:删除完整的代码,将文本块分成段落,链接到doc of strcmp,而不是在这里重复。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2022-01-16
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
相关资源
最近更新 更多