这就是我尝试过的。
这适用于像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);
代码还有其他弱点,但这是目前的关键。