这个小程序基本上应该得到用户输入,读取它是否有任何A或A并将这些计数存储到Array[]
。然后打印出Array[]
的计数。
#include<stdio.h>
main()
{
int Array[100] = {0};
int i;
char input[100];
printf("Enter a message:...");
gets(input);
for(i=0; input[i]!='\0'; i++)
{
if (input[i]=='a' || input[i]=='A') {Array[i]++;}
}
printf("Total A's:%d\n",Array[i]);
}
来自控制台的输入/输出示例:
Enter a message:...harry
Total A's:0
显然输入中有一个'a',但没有考虑。现在我尝试将printf放在for循环中,但它会输出:
Enter a message:...harry
Total A's:0
Total A's:1
Total A's:0
Total A's:0
Total A's:0
正在发生的事情是它显然读取了多少个字符是消息,并检查每个索引是否有一个应该这样做,但它也在每个索引打印出这个输出。
它应该只有printf
ONCE.so将printf
置于循环中确实有效,但用它生成“bug”。
答案 0 :(得分:0)
问题是
printf("Total A's:%d\n",Array[i]);
不符合您的想法。从逻辑上看,您尝试打印的值是无用的。
不是为'A'
或'a'
的每次出现增加计数,而是只增加特定索引的初始值({{ 1}})您在Array
找到了匹配项。之后,您以任何方式打印索引变量的值,其值未被更改(提示:检查循环后input
的值)。
显然,您不需要一个数组来保存单个变量的计数。只需使用一个普通变量,将其初始化为0并继续增加它。
答案 1 :(得分:0)
在最后一次迭代中,我等于99.然后我增加到100,所以循环结束然后你想要打印数组[100]。 该索引超出范围,因此它是未定义的行为。
正如您在评论中所说,您希望存储数组中所有字符的计数。然后根据字母表中的位置计算数组中索引的字母。
#include <ctype.h>
for(i=0; input[i]!='\0'; i++)
{
char c = tolower(input[i]);
if (isalpha(c))
Array[c - 'a']++;
}
这种方式&#39; a&#39;将是索引0,&#39; b&#39; 1等
&#39;一个&#39;是一个整数值(ascii表中的97)。 &#39; B&#39;是98,c =&#39; 99&#39;所以当你有一个&#39;在一个变量中,你减去一个文字&#39; a&#39;结果= 0。&#39; b&#39; - &#39; a&#39; = 1&#39; c&#39; - &#39; a&#39; = 2等
在此处查看ascii表值:
答案 2 :(得分:0)
#include<stdio.h>
main()
{
int Array[100] = {0};
int i;
char input[100];
printf("Enter a message:...");
gets(input);
for(i=0; input[i]!='\0'; i++)
{ int j = 0;
if (input[i]=='a' || input[i]=='A') {Array[j]++;}
}
printf("Total A's:%d\n",Array[0]);
}
已解决:)
答案 3 :(得分:0)
您的问题是经典频率问题。无论何时需要计算一组值的频率,都可以使用能够保存该数量值的数组。在您的情况下,您需要知道'a'
和'A'
s出现的频率,总共2
个元素(初始化为零)。
当您执行代码并测试任何一个值的出现时,您只需递增与该值对应的元素,例如
a_array[0]++; /* when an 'a' is encountered */
a_array[1]++; /* when an 'A' is encountered */
扫描整个字符串后,'a'
的数量位于a_array[0]
,'A'
的数量位于a_array[1]
。
将它们放在一起,同时将gets
(您永远不会再使用)替换为fgets
,您可以执行以下操作:
#include <stdio.h>
#include <string.h>
#define MAXC 256
int main (void) {
int a_array[2] = {0}; /* if you are counting 'a's and 'A's, you need 2 */
char buf[MAXC] = "";
while (fgets (buf, MAXC, stdin)) /* for each line of input */
{
char *p = buf;
size_t len = strlen(p); /* get the length */
if (buf[len-1] == '\n') /* remove the trailing '\n' */
buf[--len] = 0; /* by overwriting with '\0' */
for (; *p; p++) /* for each char in buf */
if (*p == 'a') /* is it an 'a'? */
a_array[0]++; /* if so increment the 'a' counter */
else if (*p == 'A') /* if it is an 'A' */
a_array[1]++; /* increment the 'A' counter */
printf ("\nthere are '%d' a's and '%d' A's in\n'%s'\n",
a_array[0], a_array[1], buf);
a_array[0] = a_array[1] = 0; /* zero for next line */
}
return 0;
}
示例使用/输出
$ printf "my dog has A lot of fleas\nA snake has none - Amen.\n" | \
./bin/num_aAs
there are '2' a's and '1' A's in
'my dog has A lot of fleas'
there are '2' a's and '2' A's in
'A snake has none - Amen.'
现在通常,您不会硬编码a_array[0]
和a_array[1]
,但会使用逻辑索引来保存值。例如,要计算每个字母a-z
每次出现的频率(共26个字符),您可以使用:
int c_array[26] = {0};
然后在测试每个字符时,只需增加c_array[*p - 'a']++;
,例如
while (fgets (buf, MAXC, stdin)) /* for each line of input */
{
char *p = buf;
/* trim '\n' */
for (; *p; p++) /* for each char in buf */
if ('a' <= *p && *p <= 'z')
c_array[*p - 'a']++;
...
结果c_array
将保留'a'
中c_array[0]
的数量以及后续元素中的每个对应字母频率c_array[25]
,其中包含所有{{1}的频率1}} S上。
例如,如果您想尝试针对您的问题的逻辑索引方案,您可以使用以下顺序的东西:
'z'