这就是我尝试过的。
这适用于像wel $ co * me这样的小字符串
但是给出了pass @ word的奇怪输出。我到底哪里出问题了?

#include <stdio.h>
#include <string.h>
int main()
{
  char s[100],rs[100];
    int i,c=0;
  scanf("%s",s);
  int n = strlen(s);
  for(i=0;i<n;i++)
  {
    if(((int)s[i] >= 65 && (int)s[i] <= 90) ||((int)s[i] >=97 && (int)s[i] <= 122)  )
    {
      rs[c] = s[i];
      c++;

    }

    else
    {
      continue;

    }
  }
printf("%s",rs);
      return 0;
}

最佳答案

但是给出了pass @ word的奇怪输出。我到底哪里出问题了?


printf("%s",rs);期望rs是指向字符串的指针。但是,在rs所指向的数据中没有确定的空字符时,结果是未定义的行为,或者在OP的情况下为“奇怪的输出”。

一个简单的解决方案是

rs[c] = '\0'; // add this after the loop
printf("%s",rs);




另一个重要的方面是避免缓冲区溢出-使用宽度限制。

// scanf("%s",s);
scanf("%99s",s);




代码还有其他弱点,但这是目前的关键。

10-05 22:59
查看更多