0

我想编写一个程序来计算字符串中每个字母的出现次数,然后打印每个字母中的一个,然后打印该字母的计数。

例如:

aabbcccd- 有 2 a、 2 b、 3c和 1d

所以我想将其转换并打印为:

a2b2c3d1

我编写了代码(见下文)来执行此计数/转换,但由于某种原因我没有看到任何输出。

#include<stdio.h>
main()
{
    char array[]="aabbcccd";
    char type,*count,*cp=array;
    while(cp!='\0'){
      type=*cp;
      cp++;
      count=cp;
      int c;
      for(c=1;*cp==type;c++,cp++);
      *count='0'+c;
    }
    count++;   
    *count='\0';
    printf("%s",array);
}

谁能帮我理解为什么我没有看到任何输出printf()

4

5 回答 5

3
char array[]="aabbcccd";
char type,*count,*cp=array;
while(cp!='\0'){ 

*cp是一个指针,它指向数组的起始地址,它永远不会==指向一个字符'\0',所以它不能离开循环。

您需要尊重指针以获取它所指向的内容:

while(*cp != '\0') {
...

此外,你有一个;for 循环之后,跳过它的内容:

for(c=1;*cp==type;c++,cp++); <-- this ; makes it not execute the code beneath it

在解决了这两个问题后,代码会产生一个输出:

mike@linux-4puc:~> ./a.out 
a1b1c2cd

还不是您想要的,但可以解决“printf not functional”的问题

于 2012-10-23T14:10:34.520 回答
3

顺便说一句,这段代码还有一些其他的主要问题:

  1. 如果最后一个字符出现一次,则尝试在字符串末尾写入(您'1'在尾随的位置写入一个,然后在'\0'其后写入'\0'一个字符。
  2. '0' + 10如果一个字符出现超过 9 次 ( is ':'),您的代码将不起作用。
  3. 如果一个字符出现超过 2 次("dddd"不会变成"d4";它会变成"d4dd"),您的代码将不起作用。
于 2012-10-23T14:22:01.733 回答
1

可能是行缓冲。将 a 添加\n到您的printf()格式字符串。另外你的代码很吓人,如果连续有超过 9 个相同的字符会发生什么?

于 2012-10-23T14:08:25.160 回答
0

1) 纠错

while(*cp!='\0'){

并不是

while(cp!='\0'){

2) 建议

不要使用 array[] 将您的结果用户放入另一个数组放入您的 rusel 它更合适和容易

于 2012-10-23T14:14:48.697 回答
0

我试图快速解决您的问题,这是我的代码:

#include <stdio.h>

#define SIZE 255

int main()
{
  char input[SIZE] = "aabbcccd";/*input string*/
  char output[SIZE]={'\0'};/*where output string is stored*/
  char seen[SIZE]={'\0'};/*store all chars already counted*/
  char *ip = input;/*input pointer=ip*/
  char *op = output;/*output pointer = op*/
  char *sp = seen;/*seen pointer=sp*/
  char c,count;
  int i,j,done;

  i=0;
  while(i<SIZE && input[i]!='\0')
  {
    c=input[i];
    //don't count if already searched:
    done=0;
    j=0;
    while(j<SIZE)
    {
      if(c==seen[j])
      {
         done=1;
         break;
      }
      j++;
    }
    if(done==0)
    {//if i never searched char 'c':
      *sp=c;
      sp++;
      *sp='\0';
      //count how many "c" there are into input array:
      count = '0';
      j=0;
      while(j<SIZE)
      {
         if(ip[j]==c)
         {
        count++;
         }
     j++;
      }
      *op=c;
      op++;
      *op=count;
      op++;
    }
    i++;
  }

  *op='\0';
  printf("input: %s\n",input);
  printf("output: %s\n",output);

  return 0;
}

不是一个好的代码有几个原因(我不检查数组大小写入新元素,我可以在第一个空项目时停止搜索,等等......)但你可以将它视为一个“起点”并改进它。您可以查看标准库以复制子字符串元素等(即 strncpy)。

于 2012-10-23T15:33:49.487 回答