关于#c语言#的问题,请各位专家解答!

1029 旧键盘
为什么不对啊

```c
#include
int main()
{
    char a[81],s[81],c[81],b[81];
    int i=0,j,t=0,f;
    gets(a);
    gets(s);
    for(i=0;a[i]!='\0';i++)
    {
        f=1;
       for(j=0;s[j]!='\0';j++)
       {
           if(a[i]==s[j])
           {
              f=0; break;
           }
           
           
       }
        if(f==1)
            c[t++]=a[i];
    }
   
  int x=1;
    b[0]=c[0];
    for(i=1;c[i]!='\0';i++)
    {
        f=1;
        for(j=0;jif(c[i]==b[j] || c[i]-32==b[j])
        f=0;
       }
        if(f==0)
        continue;
        b[x++]=c[i];
    }
    b[x]='\0';
    for(i=0;b[i]!='\0';i++)
    {
        
     if(b[i]>='A' && b[i]<='Z' || b[i]<='9' && b[i]>='0')
       printf("%c",b[i]);
    else
        printf("%c",b[i]-32);
    }
    printf("\n");
  return 0;
}

```

gets 函数已经被标记为不安全的函数,可以替换为更安全的 fgets 函数。
代码中没有处理多个空格字符的情况。当输入的字符串中包含多个连续的空格字符时,输出结果中可能存在多余的空格字符。
在比较字符是否相等时,应该考虑大小写敏感性。题目要求忽略大小写,但是代码中只考虑了字符 ASCII 码值相等的情况,没有考虑大小写字母的关系。
在输出结果时,应该按照题目要求将字母转换为大写形式。
建议对代码进行以下修改:


#include <stdio.h>
#include <string.h>
#include <ctype.h>  // 包含 toupper 函数

int main() {
    char a[81], s[81], c[81], b[81];
    int i = 0, j, t = 0, f;
    fgets(a, 81, stdin);  // 使用 fgets 获取输入,限制输入长度为 80 个字符(最后一个字符为换行符)
    fgets(s, 81, stdin);
    for (i = 0; a[i] != '\n'; i++) {  // 遍历字符串直到遇到换行符
        f = 1;
        for (j = 0; s[j] != '\n'; j++) {  // 遍历字符串直到遇到换行符
            if (toupper(a[i]) == toupper(s[j])) {  // 将字符转换为大写形式进行比较
                f = 0;
                break;
            }
        }
        if (f == 1 && !isspace(a[i]))  // 当 a[i] 不是空格时才将其存入 c 数组
            c[t++] = a[i];
    }

    int x = 1;
    b[0] = c[0];
    for (i = 1; c[i] != '\0'; i++) {
        f = 1;
        for (j = 0; j < i; j++) {
            if (toupper(c[i]) == toupper(b[j])) {  // 将字符转换为大写形式进行比较
                f = 0;
                break;
            }
        }
        if (f == 0)
            continue;
        b[x++] = c[i];
    }
    b[x] = '\0';
    for (i = 0; b[i] != '\0'; i++) {
        if (isalpha(b[i]))  // 判断是否为字母
            printf("%c", toupper(b[i]));  // 转换为大写字母输出
        else
            printf("%c", b[i]);
    }
    printf("\n");

    return 0;
}

for(i=1;c[i]!='\0';i++)
这里有问题,c数组你并没有初始化为0啊
定义c数组时,直接初始化为0,如 char c[81] = {0};

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/535
  • 除此之外, 这篇博客: 用c语言实现三子棋,它来了!!中的 玩家落子 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • void playerMove(char ChessBoard[MAX_ROW][MAX_COL]){//玩家落子
    	while (1){
    		printf("请玩家输入坐标(row,col):");
    			int row = 0;
    			int col = 0;
    		scanf("%d %d", &row, &col);
    		if (row<0 || row>=MAX_ROW || col<0 || col>=MAX_COL){
    			printf("您的输入有误,请重新输入!\n");
    			continue;
    		}
    		 if (ChessBoard[row][col] != ' '){
    			printf("此处已经落子!\n");
    			continue;
    		}
    		ChessBoard[row][col] = 'x';
    		break;
    	}
    }
    

      玩家采用输入行列的方式坐标的方式来落子,同时我们需要排除玩家出入的坐标是否正确的问题,如果玩家输入的坐标超出了范围,则提示玩家输入错误,重新输入,如果玩家输入的坐标的格子已经有一个元素了,则提醒玩家此处已经落子。当玩家正确落子时,我们规定落子的元素为‘X’。