我写了一个C程序。这是一个角色计数程序。我将提供如下输入
输入:ABCAPPPRC
需要输出:A2B1C2P3R1
。
但它输出为A2B1C2A1P3P2P1R1C1
。它基本上按照我在程序中编写的逻辑进行。但是我不想计算已经计算过的字符串的字符。你能说出我应该为此实施什么逻辑吗?
#include <stdio.h>
int main()
{
char str[30]= "ABCAPPPRC";
char strOutPut[60]="";
char *ptr= &str, *ptr2=&str;
char ch='A';
int count=0;
puts(str);
while (*ptr !=NULL)
{
count =0;
ch = *ptr;
while (*ptr2!= NULL)
{
if (*ptr2 == ch) count++;
ptr2++;
}
printf("%c%d",*ptr, count);
ptr++;
ptr2 = ptr;
}
}
答案 0 :(得分:4)
您需要将计数与打印分开。
例如:
#include <stdio.h>
int main(void)
{
char str[] = "ABCAPPPRC";
int counts[256] = { 0 };
puts(str);
for (char *ptr = str; *ptr != '\0'; ptr++)
counts[(unsigned char)*ptr]++;
for (int i = 0; i < 256; i++)
{
if (counts[i] != 0)
printf("%c%d", i, counts[i]);
}
putchar('\n');
return(0);
}
示例输出:
ABCAPPPRC
A2B1C2P3R1
我无法理解第一个
for
循环。你能解释一下吗?
for
控制行一次遍历字符串str
一个字符。它是原始代码中外部for
循环的while
循环等效项。
char *ptr = str;
...
while (*ptr != '\0')
{
...
ptr++;
}
循环体将*ptr
(普通char
)转换为unsigned char
(以保证其为正),然后将该值用作索引数组counts
。因此,例如,在第一次迭代中,A
被映射到65,并且counts[65]
递增。因此,对于每个字符代码,每次在字符串中遇到字符时,循环都会增加与该字符代码对应的计数。
第二个循环然后选出非零计数,将字符代码打印为字符,然后计数。
(顺便提一下,您应该从原始char *ptr = &str
收到关于char *
和char (*)[30]
之间类型不匹配的编译警告。了解何时在数组名称前添加&符号 - 除非在数组名称后面还有一个下标,否则你很少这样做。因此,&array
通常 - 但并非总是 - 错误;相反,&array[0]
通常是有效的。另请注意,在某些机器上,NULL
被定义为((void *)0)
,当您将其与普通char
进行比较时会发出警告,就像使用while (*ptr != NULL)
时一样。您应该将字符与{{1}进行比较在我的重写中;你应该保留'\0'
以便与指针一起使用。)
答案 1 :(得分:1)
str
是一个字符指针,所以当你这样做时:char *ptr= &str
你将指向字符的指针转换为char*
。松开&符号(&
)。
同样在内循环中,您应该检查是否已经处理了ch
的给定值。如果您在ptr指向第二个A
时使用,您应该继续,因为您已经在答案中添加了A
- s的数量。
您的解决方案远非最佳。我强烈建议您查找计算排序。它将使您的解决方案更快,但也会使其更简单。
答案 2 :(得分:1)
@ Jonathan你的解决方案只有当字符串字符按照ABCDEF的升序给出时才是正确的,但是当字符顺序改变时它会给出问题。输入字符串为“ABAPPPRCC”,所需输出为A2B1P3R1C2。 在这种情况下,您的解决方案将更改为A2B1C2P3R1。
以下程序可以在不改变字符串形成的情况下提供字符数。
char *str= "ABAPPPRCC";
char strOutPut[30]="";
char *ptr = str, *ptr2 = str;
char ch='A';
int count=0, i = 0 , total_print = 0;
puts(str);
while (*ptr != '\0')
{
count =0;
ch = *ptr;
while (*ptr2!= '\0')
{
if (*ptr2 == ch) count++;
ptr2++;
}
for( i = 0; i < total_print ; i++ )
{
if ( ch == strOutPut[i] )
{
i = total_print + 1;
break;
}
}
if( i <= total_print )
{
printf("%c%d",*ptr, count);
strOutPut[total_print++] = ch;
}
ptr++;
ptr2 = ptr;
}
答案 3 :(得分:0)
#include <stdio.h>
int main(void){
const char noncountchar = '\x11';
char str[30]= "ABCAPPPRC";
char strOutPut[60]="";
char *ptr, *ptr2;
char ch;
int count=0, len=0;
puts(str);
for(ptr=str;ch=*ptr;++ptr){
if(ch == noncountchar) continue;
count =1;
for(ptr2=ptr+1;*ptr2;++ptr2){
if (*ptr2 == ch){
*ptr2 = noncountchar;
++count;
}
}
len += sprintf(strOutPut+len, "%c%d", *ptr, count);
}
printf("%s", strOutPut);
return 0;
}