如何获得此计划中的投入?

时间:2017-07-03 03:57:50

标签: c

除了字符串,我不能接受输入。 如果我在代码本身提供输入,程序正在运行。 但是当我尝试接受输入时,它不起作用。 如何让它接受给定的输入? 例如,如果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);
}

1 个答案:

答案 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()调用返回的值来进一步改进代码并确保输入符合预期。