#include <stdio.h>
#include <string.h>
void Remove_the_newline_character (char str[]);
void strToWord (char str[], // 字符串地址
int n, //指str中字符串的个数
char wordBuff[][100] // 单词(字符串)地址
);
int compare (char str[]); //比较 一个字符串中不重复的单词个数并返回
int main()
{
char str_tmp[100]; //用于临时存放字符串
char strBuff[100]; //用来存放所有字符串
char *p = strBuff; //p 指向 strBuff 中的字符串
char wordBuff[100][100]; //转换后字符串变为单词(字符串)存放在此, 每个二维数组的第二维的第一个存放后面的字符串个数
int n; //用于接收开始的数字
int c; //临时的
int i; // 给 for 循环用
printf ("请输入:");
scanf ("%d", &n);
getchar ();
c = n;
//接收输入
while (c--)
{
fgets(str_tmp, 100, stdin);
Remove_the_newline_character (str_tmp);
strcpy (p,str_tmp);
p += strlen(str_tmp) + 1;
}
//转换
strToWord (strBuff, n, wordBuff);
//计算并打印
for (i =0; i < n; i++)
{
printf ("%d\n", compare (&wordBuff[i][0]));
}
return(0);
}
void Remove_the_newline_character(char str[])
{
int tmp;
char *p;
p = str + strlen(str) -1;
*p = '\0';
}
void strToWord(char str[], // 字符串地址
int n, //指str中字符串的个数
char wordBuff[][100] // 单词地址
)
{
char *p = str;
int w_p; //指向 wordBuff 二维数组的第二维
int i, k;
int p_len;
int count = 0; //统计字符串的个数
for (i = 0; i < n; i++)
{
w_p = 1; //复位, 从1开始保留0 , 0存放个数
count = 0; //复位
p_len = strlen (p);
for (k = 0; k < p_len; k++)
{
if (*p != ' ')
{
wordBuff[i][w_p++] = *p;
p++;
}
else
{
wordBuff[i][w_p++] = '\0'; //把每个转换后的单词便为字符串
p++;
count++;
}
}
wordBuff[i][w_p++] = '\0'; // 为最后一次加 '\0'
count++; // 加上最后一个
wordBuff[i][0] = count;
p++; // 使 p 指向下一个字符串
}
}
int compare(char str[]) //比较 一个字符串中不重复的单词个数并返回
{
char *p1 = str;
char *p2 = str;
int t = *p1; // str 中第一个是后面字符串的个数
int i, k;
int count = 1; // 第一个字符串先算上
t--; // t是字符串个数, 需要减一
p1++; //p1 指向第一个字符串
p2++;
p2 += strlen (p1) + 1;
for (i = 0; i < t; i++)
{
for (k = 0; k < t - i; k++)
{
if (i == 0) //只有第一次才 加 ,其他都 减
{
if (strcmp(p1, p2) != 0) //找不同
{
count++;
}
}
else
{
if (strcmp(p1, p2) == 0) //找相同
{
count--;
}
}
p2 += strlen (p2) + 1; // 指向下一个
}
p1 += strlen (p1) + 1; // p1 指向下一个
p2 = p1;
p2 += strlen(p1) + 1; // p2 复位
}
return count;
}
注:程序对空格特别敏感,测试时要多留意
程序写的不好,请多包涵
程序不敢保证没有问题,只是简单测试了几下,应该还有bug |