我有要求输入字符串(mystring)和char(ch)的程序。然后它从字符串(mystring)中删除所有输入的字符(ch)。例如“abcabc”和char'a',那么结果应该是“bcbc”。 - 当我使用scanf时,如果字符串没有空格,程序可以很好地工作。如果我输入“abc abc abc”它只读取并处理前3个字母(直到空格)。 然后我被建议使用gets(mystr);因为它可以读取所有的搅拌。但是当我使用gets时,结果与输入字符串相同,没有任何反应。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
int main(int argc, char *argv[])
{
char mystr[N] ,result[N];
char ch;
int i,k;
k=0;
printf("enter string \n");
//gets(mystr);///////////////////////////
//scanf("%s",&mystr);///////////////////
printf("enter char \n");
scanf("%c",&ch);
scanf("%c",&ch);
for ( i = 0; i <= strlen(mystr); i++ )
{
if (mystr[i] != ch)
{
result[k]=mystr[i];
k++;
}
}
puts(result);
system("pause");
return 0;
}
答案 0 :(得分:6)
scanf("%c",&ch);
scanf("%c",&ch);
第二个scanf
是你的问题。它正在拾取您要删除的字母后输入的换行符(并覆盖ch
的先前值。)
摆脱它。
请注意,正如手册页所示:
永远不要使用gets()。因为不知道预先知道数据有多少是不可能的 字符gets()将读取,因为gets()将继续存储字符结束 缓冲区,使用起来非常危险。它已被用来打破计算机安全。使用 相反,fgets()。
答案 1 :(得分:1)
嗯 - 不确定问题是什么 - 使用getstr,但不使用scanf作为字符串,它在visual studio中适用于我
int main(int argc, char *argv[])
{
char mystr[N] ,result[N];
char ch;
int i,k;
k=0;
printf("enter string \n");
gets(mystr);///////////////////////////
//scanf("%s",&mystr);///////////////////
printf("enter char \n");
scanf("%c",&ch);
// scanf("%c",&ch);
for ( i = 0; i <= strlen(mystr); i++ )
{
if (mystr[i] != ch)
{
result[k]=mystr[i];
k++;
}
}
puts(result);
system("pause");
return 0;
}
答案 2 :(得分:1)
使用这个:
char temp[2];
scanf("%1s",temp);
ch = temp[0];
并使用gets
scanf
与char
一起使用时会出现一些问题(它会获得“旧的”新行)。在这里我们“欺骗”一点,我们使用scanf
来获得一个最多可包含一个字符的字符串。一个1个字符的字符串显然需要第二个字符作为终结符,因此是一个包含2个字符的数组。
请注意,使用scanf
搜索字符时,您将无法插入空格字符。
请注意gets
是一个“邪恶”的功能。您可以使用它轻松地执行缓冲区溢出(它不会检查缓冲区是否足够大)。 “正确”的方式通常是:fgets(mystr, N, stdin);
(gets
的“文件”变体具有可以读取的最大字符数,并且最后会附加\0
)。请注意,如果在fgets
中插入150个字符,99将转到您的字符串(因为您提供了100个最大大小),将附加1x \0
,其他字符将保留在缓冲区中“准备好“为下一个scanf
/ gets
/ fgets
...(测试它,将缓冲区减少到一个较小的值,如5个字符,并做一些测试)
答案 3 :(得分:1)
你可以使用xanatos建议的fgets()和一个小的hack,这样你就可以可靠地处理返回字符。只需将使用fgets获取的字符串中的'\ n'更改为'\ 0'即可。
在你的程序中,你忘了用'\ 0'终止新字符串。 所以这是您正在寻找的代码。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 100
int main(int argc,char **argv){
char string[N],str1[N];
char ch;
int i,k = 0;
fgets(string,N,stdin);
string[strlen(string)-1] = '\0';
scanf("%c",&ch);
printf("\n%s , %c",string,ch);
for (i=0;i<=strlen(string);i++)
if(string[i] != ch)
str1[k++] = string[i];
str1[k] = '\0';
printf("\n%s , %s\n",string,str1);
return 0;
}