#include<stdlib.h>
#include<stdio.h>
#define NO_OF_CHARS 256
/* Returns an array of size 256 containg count
of characters in the passed char array */
int *getCharCountArray(char *str)
{
int *count = (int *)calloc(sizeof(int), NO_OF_CHARS);
int i;
for (i = 0; *(str+i); i++)
count[*(str+i)]++;
return count;
}
/* The function returns index of first non-repeating
character in a string. If all characters are repeating
then returns -1 */
int firstNonRepeating(char *str)
{
int *count = getCharCountArray(str);
int index = -1, i;
for (i = 0; *(str+i); i++)
{
if (count[*(str+i)] == 1)
{
index = i;
break;
}
}
free(count); // To avoid memory leak
return index;
}
/* Driver program to test above function */
int main()
{
char str[] = "geeksforgeeks";
int index = firstNonRepeating(str);
if (index == -1)
printf("Either all characters are repeating or string is empty");
else
printf("First non-repeating character is %c", str[index]);
getchar();
return 0;
}
我真的无法掌握以下几点:
count[*(str+i)]++;
amd
int *getCharCountArray(char *str)
{
int *count = (int *)calloc(sizeof(int), NO_OF_CHARS);
int i;
for (i = 0; *(str+i); i++)
count[*(str+i)]++;
return count;
}
该程序用于查找字符串中的第一个非重复字符。
答案 0 :(得分:1)
*(str+i)
与str[i]
相同。这一行:
for (i = 0; *(str+i); i++)
与:
相同for (i = 0; str[i]; i++)
只要str[i]
求值为非零,就会执行循环中的语句。由于C字符串是由空字符终止的字符数组,因此将for
中的每个字符执行str
循环。它会在到达字符串末尾时停止。
count[*(str+i)]++;
与:
相同 count[str[i]]++;
如果str[i]
为'a'
,此行将增加count['a']
的值,即ASCII编码中的count[97]
。
在循环结束时,count
将填充整数,这些整数表示特定字符在str
中出现的次数。
答案 1 :(得分:0)
此代码相当于您发布的混乱循环。这有帮助吗?
*(str + i)
令人困惑的表达方式str[i]
和IMO不合适。
for (i = 0; str[i] != '\0'; ++i)
{
char curr_char = str[i];
++count[curr_char];
}
答案 2 :(得分:0)
在for循环中,我们需要考虑三件事:
for loop
计数器变量的初始化(例如,我的)。 2)条件(*(str + i))3)递增/递减部分(i ++)。
执行for循环直到条件为真(即任何非零值)。所以*(str + i)提供非零值,直到数组中有任何字符..
count[*(str+i)]++; // it is counting the number of characters in the array by incrementing the string character by character.
答案 3 :(得分:0)
我真的无法掌握以下几点:
count[*(str+i)]++;
从外部工作:
str
是char
的指针而i
是int
,str + i
是指向char
的指针i
在str
本身指向*(str+i)
取消引用指针str+i
,意味着它计算指针所指向的char
。这完全等同于str[i]
。count[*(str+i)]
使用字符串char
中索引i
的{{1}}作为动态数组str
的索引。表达式指定该索引处的count
(因为int
指向count
s的数组。另见下文。int
评估数组count[*(str+i)]++
中索引为int
的{{1}}。作为副作用,它在确定表达式的值之后将该数组元素递增1。这个整体表达式专门针对其副作用出现在您的代码中。值得注意的是,尽管数组*(str+i)
中保留了空格来计算256个不同count
值的外观,但您询问的表达式并不是一种安全的方法来计算所有它们。这是因为类型count
可以实现为签名类型(由C实施者自行决定),并且通常以这种方式实现它。在这种情况下,只有非负char
值对应于数组元素,如果输入字符串包含其他元素,则会产生未定义的行为。更安全的是:
char
即。除了将输入字符串的每个字符显式地转换为 unsigned 8位值之外,与原始字符相同。
总的来说,该函数只创建一个256 char
s的数组,每个可能的#include <stdint.h>
# ...
count[(uint8_t) *(str+i)]++;
一个,并扫描字符串以计算每个int
值的出现次数出现在其中。然后它返回这个出现计数数组。
答案 4 :(得分:0)
count[*(str+i)]++ =>count[*(str+i)]=count[*(str+i)]+1
现在考虑一个场景:
char str[] = "aaab";
*(str+i)/str[i] Will show char like 'a','b'...etc.
所以
count[*(str+i)]++=count['a']++ Mean;
count['a']=count['a']+1 // Will store iteration of a=1
count['a']=count['a']+1 // Will Update iteration of a=2
count['a']=count['a']+1 // Will Update iteration of a=3
和其他角色一样。
因此count[*(str+i)]++
将更新已更新的count
中的charcarter的出现次数。