A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dream静 中级黑马   /  2014-11-3 21:59  /  3444 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1黑马币
题目大致是找出输出的字符串中得A B C D出现的次数,并且按出现次数的从大到小一次输入该字母和出现次数
我得代码是
#include <stdio.h>
void compare4(int s[]);
void charNumprintf(int k[],int x[]);

int main() {
    int charNumCount[4]={0};
   
    int charNumcopy[4]={0};
   
    char *str;
   
    scanf("%s",str);
   
    char *p =str;
   
    while (*p !='\n') {
        switch (*p) {
            case 'A':
                charNumCount[0]++;
                break;
            case 'B':
                charNumCount[1]++;
                break;
            case 'C':
                charNumCount[2]++;
            case 'D':
                charNumCount[3]++;
                break;
            default:
                break;
        }
        p++;
    }
    for (int i = 0; i < 4; i++) {
        charNumcopy[i] = charNumCount[i];
    }
    compare4(charNumCount);
   
    charNumprintf(charNumcopy, charNumCount);
   
    return 0;
}
//比较并且交换数值的函数;
void comprae4(int s[])
{
    int temp;
    for (int i=0; i<4; i++) {
        for(int j=1;j<4;j++)
        {
            if (s[j]>s[i])
            {
                temp = s[i];
                s[i] = s[j];
                s[j] = temp;
            }
        }
    }
}

void charNumprintf(int k[],int x[])
{
    for (int i =0; i < 4;i++) {
        for (int j =0; j < 4; j++) {
            if(x[i] == k[j])
            {
                printf("字母%c出现的次数是%d\n",'A'+j,x[i]);
            }
        }
    }  
}

可是为什么会报错这个东西:
Undefined symbols for architecture x86_64:
  "_compare4", referenced from:
      _main in ceshi-d1d433.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

请问这是什么意思啊?

最佳答案

查看完整内容

你报的这个错误,我已经找到了。是你 //比较并且交换数值的函数; void comprae4(int s[]) 这个地方,方法名写错了。导致链接的时候出错。 再然后,你写的这个方法,我运行了一下,各种看不懂。 char *str; scanf("%s",str); char *p =str; while (*p !='\n') { 这个地方,感觉有点乱。至少while循环这个地方,我觉得应该至少是 (*p != '\0') 吧。 如果你只是要实现这个功能,我有一个比较笨的代码,如果需要可 ...

13 个回复

倒序浏览
本帖最后由 银河雨 于 2014-11-6 16:30 编辑

你报的这个错误,我已经找到了。是你
//比较并且交换数值的函数;
void comprae4(int s[])
这个地方,方法名写错了。导致链接的时候出错。
再然后,你写的这个方法,我运行了一下,各种看不懂。

    char *str;
    scanf("%s",str);
    char *p =str;
    while (*p !='\n') {

这个地方,感觉有点乱。至少while循环这个地方,我觉得应该至少是 (*p != '\0') 吧。
如果你只是要实现这个功能,我有一个比较笨的代码,如果需要可以给你。不知道能不能解决你的问题,亲。
回复 使用道具 举报
路过看看!!!!
回复 使用道具 举报

尴尬!!!!!!
回复 使用道具 举报
看不懂你写的代码,我也遇到这个基础测试题了。我的代码如下:
#include <stdio.h>
int main()
{
        int a=0,b=0,c=0,d=0;
        char *p,s[1024];
        printf("请输入一大堆字符串(不区分大小写)\n");
        gets(s);
        for (p=s;*p!='\0';p++)                          //统计a、b、c、d出现的次数
        {
                if (*p=='a'||*p=='A')
                {a++;}
                else if (*p=='b'||*p=='B')
                {b++;}
                else if (*p=='c'||*p=='C')
                {c++;}
                else if (*p=='d'||*p=='D')
                {d++;}
        }
        int i,j,k,max[4]={a,b,c,d};                //给统计出来的数字进行排序
        for (i=0;i<=3;i++)                                 
        {                                                                                                       
                for (j=2;j>=i;j--)
                {       
                        if(max[j+1]>max[j])               //冒泡排序法
                        {
                                k=max[j];
                                max[j]=max[j+1];
                                max[j+1]=k;
                        }
                }
        }
        int x[4]={a,b,c,d};                        //按照排序依次输出
        char dx[5]="abcd";                       //使数组x和数组dx关系对应,便于输出
        for (i=0;i<4;i++)
        {
                for (j=0;j<4;j++)
                {
                        if (max[i]==x[j])              //依次输出,找到对应的统计次数a、b、c、d。   
                                printf("%c   %d\n",dx[j],max[i]);
                }
        }
       
        return 0;
}

评分

参与人数 1黑马币 +1 收起 理由
dream静 + 1 虽然我解决了还是谢谢帮忙

查看全部评分

回复 使用道具 举报
兄弟 你的错误好low啊 你那个函数名compare 拼写错误:L
回复 使用道具 举报
我给你做了些修改 你看看


  1. //题目大致是找出输出的字符串中得A B C D出现的次数,并且按出现次数的从大到小一次输入该字母和出现次数
  2. //我得代码是
  3. #include <stdio.h>
  4. void compare4(int s[]);
  5. void charNumprintf(int k[],int x[]);

  6. int main() {
  7.     int charNumCount[4]={0};
  8.    
  9.     int charNumcopy[4]={0};
  10.    
  11.     printf("请输入一个由大写字母组成的字符串:\n");
  12.    
  13.     char *str;
  14.    
  15.     scanf("%s",str);
  16.    
  17.     char *p =str;
  18.    
  19.     while (*p !='\0') /* 这里改成\0 */{
  20.         switch (*p) {
  21.             case 'A':
  22.                 charNumCount[0]++;
  23.                 break;
  24.             case 'B':
  25.                 charNumCount[1]++;
  26.                 break;
  27.             case 'C':
  28.                 charNumCount[2]++;
  29.                 break;//此处加上break
  30.             case 'D':
  31.                 charNumCount[3]++;
  32.                 break;
  33.             default:
  34.                 break;
  35.         }
  36.         p++;
  37.     }
  38.     for (int i = 0; i < 4; i++) {
  39.         charNumcopy[i] = charNumCount[i];
  40.     }
  41.     compare4(charNumCount);
  42.    
  43.     charNumprintf(charNumcopy, charNumCount);
  44.    
  45.     return 0;
  46. }
  47. //比较并且交换数值的函数;
  48. void compare4(int s[])//compare拼写错误
  49. {
  50.     int temp;
  51.     for (int i=0; i<3/* 应为n-1既4-1 */; i++) {
  52.         for(int j=i+1/* 应为i+1 */;j<4;j++)
  53.         {
  54.             if (s[j]>s[i])
  55.             {
  56.                 temp = s[i];
  57.                 s[i] = s[j];
  58.                 s[j] = temp;
  59.             }
  60.         }
  61.     }
  62. }

  63. void charNumprintf(int k[],int x[])
  64. {
  65.     for (int i =0; i < 4;i++) {
  66.         for (int j =0; j < 4; j++) {
  67.             if(x[i] == k[j])
  68.             {
  69.                 printf("字母%c出现的次数是%d\n",'A'+j,x[i]);
  70.             }
  71.         }
  72.     }
  73. }
复制代码
回复 使用道具 举报
supergcs 发表于 2014-11-12 17:28
我给你做了些修改 你看看

您好  黑马上怎么发表您的这种代码显示的格式的  谢谢了
回复 使用道具 举报
函数名写错啦
回复 使用道具 举报
花轮 中级黑马 2014-12-10 22:36:05
10#
天空总是很蓝 发表于 2014-11-19 03:21
您好  黑马上怎么发表您的这种代码显示的格式的  谢谢了

你好, 点这个链接进去关于怎么插入代码的帖子
回复 使用道具 举报
回复 使用道具 举报
bjznh 中级黑马 2014-12-16 13:34:50
12#
//比较并且交换数值的函数;
void comprae4(int s[])      // 这里写错喽,亲。
回复 使用道具 举报
为啥不用结构体呢?
typedef struct CharCount
{
    int count;//字母的出现次数
    char theChar;//字母
}CharCount;
还有,代码规范也很重要啊
回复 使用道具 举报
这个是我写的,你看看
  1. struct test        
  2.         {
  3.                 int b;   
  4.                 char c;  
  5.         } t[4];
  6. void selectsort(struct test *b,int n)   
  7. {
  8.         int i,j,k,temp;
  9.         char tem;     
  10.         for(i=0;i<n;i++)   
  11.         {
  12.                 k=i;  
  13.                 for(j=i+1;j<n;j++)
  14.                         if(b[k].b<b[j].b)
  15.                                 k=j;  
  16.                         
  17.                         temp=b[i].b;     
  18.                         b[i].b=b[k].b;
  19.                         b[k].b=temp;
  20.                         tem=b[i].c;
  21.                         b[i].c=b[k].c;
  22.                         b[k].c=tem;
  23.         }
  24.         
  25. }


  26. #include<string.h>
  27. #include <stdio.h>
  28. void main()
  29. {
  30.       
  31.    int sumA = sumB = sumC = sumD = 0;  
  32.       
  33.    char a[100];
  34.    printf("请输入字符串:");
  35.    gets(a);   //从键盘端输入字符串
  36.    printf("%s\n",a);  //输出刚输入的字符串
  37.    for(int i=0;i<100;i++)   
  38.    {
  39.            if(a[i]=='A')  
  40.                    sumA++;
  41.            else if(a[i]=='B')  
  42.                    sumB++;
  43.            else if(a[i]=='C')  
  44.                    sumC++;
  45.            else if(a[i]=='D')   
  46.                    sumD++;
  47.                   
  48.    }

  49.    printf("A出现的次数为:%d\nB出现的次数为:%d\nC出现的次数为:%d\nD出现的次数为:%d\n",sumA,sumB,sumC,sumD);

  50.    t[0].b=sumA;
  51.    t[1].b=sumB;
  52.    t[2].b=sumC;
  53.    t[3].b=sumD;  
  54.    t[0].c='A';
  55.    t[1].c='B';
  56.    t[2].c='C';
  57.    t[3].c='D';  
  58.    selectsort(t,4);   

  59.    printf("出现次数由高到低的字母和出现次数为:\n");
  60.    printf("字母        出现次数\n");   

  61.    for(i=0;i<4;i++)   
  62.    printf("%c\t        %d\n",t[i].c,t[i].b);
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马