除了字符串,我不能接受输入。 如果我在代码本身提供输入,程序正在运行。 但是当我尝试接受输入时,它不起作用。 如何让它接受给定的输入? 例如,如果s是“codebook”,并且从=='o'到=='e',则s将变为“cedebeek”。
#include<stdio.h>
#define MAX 50
void replace(char *s, char from, char to)
{
int i=0;
while(s[i]!='\0')
{
if(s[i]==from)
{
s[i]=to;
}
i++;
}
}
int main()
{
char str[MAX];
char from;
char to;
printf("Enter the string");
scanf("%[^\n]s",&str[0]);
printf("\nEnter the character to be replaced");
scanf("%c",&from);
printf("\nEnter the character to be replaced with");
scanf("%c",&to);
replace(str, from, to);
printf("\nThe modified string is %s",str);
return(0);
}
答案 0 :(得分:1)
发布的代码中存在一些问题。由于数组在大多数表达式中衰减为指向其第一个元素的指针,因此在调用&
时不需要地址运算符scanf()
;此外,尾随s
不是扫描集转换说明符的一部分:
scanf("%[^\n]", str);
正如@M.M在评论中指出的那样,使用&str[0]
而不是str
并不是错误的,但它更具惯用性,我个人觉得更清楚,使用不那么混乱的str
。
当scanf()
返回时,输入流中会留下换行符,因此您应在下次调用scanf()
时添加一个前导空格,以跳过此\n
字符阅读用户输入:
scanf(" %c",&from);
此对scanf()
的调用也会在输入流中留下\n
个字符,所以再次:
scanf(" %c",&to);
请注意,在将用户输入读入字符串时,应该确实指定最大宽度以避免缓冲区溢出;使用MAX
没有简单的方法可以做到这一点,但你可以这样做:
scanf("%49[^\n]", str);
您可以通过检查scanf()
调用返回的值来进一步改进代码并确保输入符合预期。