#include <stdio.h> #include <stdlib.h> int main() { int freq[26] = { 0 }; int pos[26] = { 0 }; int cnt = 0, min = 9999, firstIndex = -1; char ch; while ((ch = getchar()) != '\n') { int off = ch - 'a'; if (pos[off] == 0) { pos[off] = cnt++; } freq[off] ++; } for (int i = 0; i < 26; i++) { if (freq[i] == 1) { if (min > pos[i]) { min = pos[i]; firstIndex = i; } } } if (firstIndex != -1) printf("%c\n", 'a' + firstIndex); else printf("no\n"); return 0; }详细解释
时间: 2023-12-25 17:03:30 浏览: 17
这是一个 C 语言程序,用于输入一个字符串并找出字符串中第一个出现且仅出现一次的小写字母。以下是程序的逐行解释:
```c
#include <stdio.h>
#include <stdlib.h>
```
这两行代码包含了程序所需的头文件。
```c
int main() {
```
程序从这里开始执行,`main()` 函数是 C 语言程序的入口函数。
```c
int freq[26] = { 0 };
int pos[26] = { 0 };
int cnt = 0, min = 9999, firstIndex = -1;
char ch;
```
这几行代码定义了程序需要用到的变量。`freq[26]` 数组用于记录每个小写字母出现的次数,`pos[26]` 数组用于记录每个小写字母第一次出现的位置。`cnt` 变量用于记录已经扫描的字符数,`min` 变量用于记录第一个仅出现一次的字符的位置,`firstIndex` 变量用于记录第一个仅出现一次的字符的下标。`ch` 变量用于暂存输入的字符。
```c
while ((ch = getchar()) != '\n')
{
int off = ch - 'a';
if (pos[off] == 0)
{
pos[off] = cnt++;
}
freq[off] ++;
}
```
这个 `while` 循环用于输入字符串,并统计每个小写字母出现的次数和第一次出现的位置。`getchar()` 函数每次读入一个字符,如果读到了换行符 `\n`,则结束循环。`off` 变量用于记录当前字符相对于小写字母 `a` 的偏移量,如果之前没有出现过这个字符,就记录下当前位置 `cnt`,并将 `pos[off]` 的值设为 `cnt++`。然后将 `freq[off]` 的值加一,表示这个字符出现了一次。
```c
for (int i = 0; i < 26; i++)
{
if (freq[i] == 1)
{
if (min > pos[i])
{
min = pos[i];
firstIndex = i;
}
}
}
```
这个 `for` 循环遍历每个小写字母,找出第一个仅出现一次的字符,并记录该字符的下标。如果当前字符出现了一次,就比较它的位置 `pos[i]` 是否比当前最小位置 `min` 还小,如果是,就更新 `min` 和 `firstIndex` 的值。
```c
if (firstIndex != -1)
printf("%c\n", 'a' + firstIndex);
else
printf("no\n");
```
根据找到的第一个仅出现一次的字符的下标,输出该字符或者输出 "no"。如果 `firstIndex` 的值不是 -1,就打印出该字符,打印时将其转换为 ASCII 码对应的字符。如果 `firstIndex` 的值是 -1,就打印 "no"。最后,返回 0,表示程序正常退出。