0

文字列内の各文字の出現回数をカウントし、各文字の 1 つに続いてその文字のカウントを出力するプログラムを書きたかったのです。

例えば:

aabbcccd- 2 a、 2 b、 3 c、および 1 があるd

したがって、これを次のように変換して印刷したいと思います。

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

ちなみに、このコードには他にも大きな問題がいくつかあります。

  1. 最後の文字が 1 回表示される場合は、文字列の末尾を超えて書き込もうとします ('1'末尾'\0'があった場所に a を書き、'\0'その 1 文字先を書きます。
  2. '0' + 10文字が 9 回以上表示される場合 ( is ) 、コードは機能しません':'
  3. 文字が 2 回以上表示される場合、コードは機能しません ("dddd"にならず"d4"、 になります"d4dd")。
于 2012-10-23T14:22:01.733 に答える
3
char array[]="aabbcccd";
char type,*count,*cp=array;
while(cp!='\0'){ 

*cp配列の先頭のアドレスを指しているポインタです。決して==char'\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が機能しない」という問題は解決します

于 2012-10-23T14:10:34.520 に答える
1

おそらくラインバッファリングです。フォーマット文字列に a を追加\nします。printf()また、あなたのコードは非常に恐ろしいものです。同じ文字が 9 つ以上連続するとどうなりますか?

于 2012-10-23T14:08:25.160 に答える
0

1)エラー訂正

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

ではなく

while(cp!='\0'){

2)アドバイス

array[]を使用して結果ユーザーに別の配列を配置してルーセルに配置しないでください。

于 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 に答える