如何在不使用数组的情况下计算C中的相同字符

如何在不使用数组的情况下计算C中的相同字符,c,char,C,Char,我一直在处理以.txt文件编写的数据,因此遇到了一些问题 Example of data: lettts ddo ttttthis Example of answer: le3ts 2do 5this 我尝试读取了2次信息,第二次忽略第一个字符,并在读取函数下面与for循环if(char1==char2)count++进行比较1) printf(“%d”,计数); ch2&&putchar(ch2);//如果(ch2)putchar(ch2); 如果(ch==EOF) 打破 计数=1; ch2

我一直在处理以.txt文件编写的数据,因此遇到了一些问题

Example of data: lettts ddo ttttthis
Example of answer: le3ts 2do 5this
我尝试读取了2次信息,第二次忽略第一个字符,并在读取函数下面与for循环
if(char1==char2)count++进行比较
#include <stdio.h>
#include <stdlib.h>

int main()
{
  char ch,ch2,chvoid;
  int i,num=0,num2=0;
  FILE *fp;

  if (fp = fopen("file.txt", "r"))
  {
    while (ch != EOF)
    {
      ch = getc(fp);
      printf("%c", ch);
    }
    fclose(fp);
  }

  if (fp = fopen("file.txt", "r"))
  {
    chvoid = getc(fp);
    while (ch2 != EOF)
    {
      ch2 = getc(fp);
      printf("%c", ch2);
      num++;
    }
    fclose(fp);
  }
  for(i=1;i<num;i++){
    if(ch!=ch2){
      printf("test");
    }                 
    if(ch==ch2){
      num2++;     
      printf("%d ",num2);
    }       
    num2=0; 
  }
  return 0;
}
#包括
#包括
int main()
{
char ch,ch2,chvoid;
int i,num=0,num2=0;
文件*fp;
如果(fp=fopen(“file.txt”,“r”))
{
while(ch!=EOF)
{
ch=getc(fp);
printf(“%c”,ch);
}
fclose(fp);
}
如果(fp=fopen(“file.txt”,“r”))
{
chvoid=getc(fp);
而(ch2!=EOF)
{
ch2=getc(fp);
printf(“%c”,ch2);
num++;
}
fclose(fp);
}

对于(i=1;i可能是这样的

    while( data[i] != '\0' )
    {
        char c = data[i++];
        int counter = 1;

        while( c == data[i] )
        {
            counter++;
            i++;
        }

        if( counter - 1 )
            printf( "%d", counter );

        printf( "%c", c );
    }
冲洗液

您需要这样做。这将清除标准输出和标准输入“fflush(null)”的缓冲区


好的,也许是这样。我不知道您想要文件中的数据

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

int main( )
{
    char ch, ch2, chvoid;
    int i, num = 0, num2 = 0;
    FILE *fp;

    if( fp = fopen( "file.txt", "r" ) )
    {
        while( ch != EOF )
        {
            ch = getc( fp );
            printf( "%c", ch );
        }
        fclose( fp );
    }

    if( fp = fopen( "file.txt", "r" ) )
    {
        int c = getc( fp );

        while( c != EOF )
        {
            int c2 = getc( fp );
            int counter = 1;

            while( c2 == c )
            {
                counter++;
                c2 = getc( fp );
            }

            if( counter - 1 )
                printf( "%d", counter );

            printf( "%c", c );

            c = c2;
        }

        fclose( fp );
    }


    return 0;
}
#包括
#包括
int main()
{
char ch,ch2,chvoid;
int i,num=0,num2=0;
文件*fp;
如果(fp=fopen(“file.txt”,“r”))
{
while(ch!=EOF)
{
ch=getc(fp);
printf(“%c”,ch);
}
fclose(fp);
}
如果(fp=fopen(“file.txt”,“r”))
{
int c=getc(fp);
而(c!=EOF)
{
int c2=getc(fp);
int计数器=1;
而(c2==c)
{
计数器++;
c2=getc(fp);
}
如果(计数器-1)
printf(“%d”,计数器);
printf(“%c”,c);
c=c2;
}
fclose(fp);
}
返回0;
}
#包括
内部主(空){
文件*fp;
int ch,ch2,计数;
if(NULL==(fp=fopen(“file.txt”,“r”)){
perror(“文件无法打开”);
返回1;
}
printf(“数据示例:”);
而((ch=fgetc(fp))!=EOF){
putchar(ch);
}
putchar('\n');
倒带(fp);
printf(“答案示例:”);
计数=ch2=0;
而(1){
ch=fgetc(fp);
if(ch2!=ch){
如果(计数>1)
printf(“%d”,计数);
ch2&&putchar(ch2);//如果(ch2)putchar(ch2);
如果(ch==EOF)
打破
计数=1;
ch2=ch;
}否则{
++计数;
}
}
fclose(fp);
返回0;
}

如果我可以使用数组,情况就是这样:这与上面的问题有什么关系?这只是一个建议,就像过去我在迭代多个字符时经常遇到问题一样。我只想在注释中传递类似的建议。本网站的答案部分仅用于实际回答问题。您将获得所需的声誉(50)如果您在此处发布高质量的答案或问题,请立即发表评论。同时,请不要将这些评论或建议作为答案添加。好的,我很抱歉……将全部删除为什么您不能使用数组?我们可以假设这是一个学术练习吗?看起来您离此不远,但您正在比较递增的ch2 against ch由第一个循环设置为EOF。仔细检查后,看起来您试图像在数组中一样迭代for循环中的单个字符,但实际上ch和ch2都是EOF。您需要一种不同的循环策略:使用while not EOF和getc对字符串进行迭代,每次都存储上一个字符,这样您就可以mpare反对。
getc
返回一个
int
,原因很充分(请参阅),将其返回值存储在字符中会导致问题。请注意,假定要读取的数据不包含数字字符。
#include <stdio.h>

int main(void){
    FILE *fp;
    int ch, ch2, count;

    if(NULL==(fp = fopen("file.txt", "r"))){
        perror("file can not open.");
        return 1;
    }
    printf("Example of data: ");
    while((ch=fgetc(fp)) != EOF){
        putchar(ch);
    }
    putchar('\n');
    rewind(fp);

    printf("Example of answer: ");
    count = ch2 = 0;
    while(1){
        ch=fgetc(fp);
        if(ch2 != ch){
            if(count > 1)
                printf("%d", count);
            ch2 && putchar(ch2);//if(ch2)putchar(ch2);
            if(ch == EOF)
                break;
            count = 1;
            ch2 = ch;
        } else {
            ++count;
        }
    }
    fclose(fp);
    return 0;
}