题解 | #魔咒词典#
魔咒词典
https://www.nowcoder.com/practice/c6ca566fa3984fae916e6d7beae8ea7f
#include <stdio.h> #include <string.h> #include <stdlib.h> //思路:这题学到的知识太多了 // 1.超大数组放在main函数外部定义,不然自动退出 //2.c语言提供strcspn函数可以返回你在字符串中想找到的字符的位置,可以用于去掉fgets输入的换行 //3.解题注意测试输入暗含的换行字符会被gets,用strcmp要注意 //4. 对字符串进行赋值,都会自动在后面加入'\0','\0'后的字符不会对程序造成影响,所以不用担心上一次的旧值会残留 typedef struct snode { char zhou[21]; char usage[81]; } snode; snode s[100000] = {0}; int main() { // printf("test\n"); char tmp[105] = {'\0'}; int i = 0; while (1) { fgets(tmp, 105, stdin); if (strcmp(tmp, "@END@\n") == 0) { break; } int j; for (j = 0; j < 20; j++) { if (tmp[j] == ']') { break; } } strcpy(s[i].usage, &tmp[j + 2]); //赋值用处 for (int k = 0; k <= j; k++) { //赋值咒语 s[i].zhou[k] = tmp[k]; } i++; } int n; scanf("%d\n", &n); for (int k = 0; k < n; k++) { fgets(tmp, 105, stdin); if (tmp[0] == '[') { //说明是咒语匹配 tmp[strcspn(tmp, "\n")] = '\0';//去掉换行 for (int m = 0; m < i; m++) { if (strcmp(tmp, s[m].zhou) == 0) { printf("%s", s[m].usage); break; } if (m == (i - 1)) { printf("what?\n"); } } } else { //说明是功能匹配 for (int m = 0; m < i; m++) { if (strcmp(tmp, s[m].usage) == 0) { s[m].zhou[strcspn(s[m].zhou, "]")] = 0; printf("%s\n", &s[m].zhou[1]); break; } if (m == (i - 1)) { printf("what?\n"); } } } } }