我编写了以下程序,以找出字符数组中每个数字出现的次数。
int main(){
char s[2000],count,j=0;
fgets(s,2000,stdin);
for(int i=0;i<=9;i++)
{
count=0;j=0;
while(*(s+j))
{
if(isdigit(*(s+j)))
{
if(i==(*(s+j)-'0'))
count++;
}
j++;
}
printf("%d ",count);
}
return 0;
}
但是它不能用于大量输入。
b3n47b5xf13qlx233rg4u2c949i623e34nt5661se06b675utbpy258wz633855846l761d61x340h1vn19w191sj18v2u333556bh6m5uc4u050am05p961dhmpu6iq4667zg9
预期输出为
5 10 5 12 8 11 15 4 4 6
但是我得到的输出是
5 10 5 12 7 11 13 3 4 5
有人可以帮我找出我哪里出了问题吗?
答案 0 :(得分:4)
除了DYZ的答案,您的逻辑也很复杂。您无需同时测试if(isdigit(*(s+j)))
和if(i==(*(s+j)-'0'))
,只需要重构代码并提供单个测试并使用频率阵列即可。
(一个由10个元素初始化为全零的简单数组,在找到该数字后,您将递增与每个数字相对应的索引,从而导致该数字的计数在完成时出现在相应的索引处)
#include <stdio.h>
#include <ctype.h>
#define MAXC 2048 /* if you need a constant, #define one (or more) */
#define NDIGIT 10
int main (void) {
char s[MAXC] = "";
size_t digits[NDIGIT] = {0}; /* declare a 'frequency array' */
while (fgets (s, MAXC, stdin)) { /* read all blocks of data */
char *p = s; /* pointer to s */
while (*p) { /* for each char in s */
if (isdigit (*p)) /* Am I a digit? */
digits[*p - '0']++; /* increment value at index */
p++; /* increment pointer */
}
}
for (int i = 0; i < NDIGIT; i++)
printf (" %zu", digits[i]);
putchar ('\n');
return 0;
}
或者没有ctype.h
,
#include <stdio.h>
#define MAXC 2048 /* if you need a constant, #define one (or more) */
#define NDIGIT 10
int main (void) {
char s[MAXC] = "";
size_t digits[NDIGIT] = {0}; /* declare a 'frequency array' */
while (fgets (s, MAXC, stdin)) { /* read all blocks of data */
char *p = s; /* pointer to s */
while (*p) { /* for each char in s */
if ('0' <= *p && *p <= '9') /* Am I a digit? */
digits[*p - '0']++; /* increment value at index */
p++; /* increment pointer */
}
}
for (int i = 0; i < NDIGIT; i++)
printf (" %zu", digits[i]);
putchar ('\n');
return 0;
}
使用/输出示例
在两种情况下,输入的输出均为:
5 10 5 12 8 11 15 4 4 6
仔细检查一下,如果还有其他问题,请告诉我。
答案 1 :(得分:2)
您将$ cmake --build out
声明为j
(也声明了char
,但这是另一个问题)。 (带符号的)count
变量的最大值为127。当字符串包含128个以上字符时,char
溢出:j
变为-128而不是128。声明所有用于索引和计数为j+1
或int
。