C语言中反转字符串的程序

C语言中反转字符串的程序,c,arrays,string,scanf,reverse,C,Arrays,String,Scanf,Reverse,我用C编写了一个程序,要求用户输入他的名字并输出字母数,然后再次询问用户是否希望将他的名字颠倒过来。如果他的回答是“是”,程序将输出颠倒过来的名字。 问题是我不知道为什么会丢失数组名称中的第一个字母 你可以试试这个代码。我认为scanf是问题的根源 #include <stdio.h> int main(){ char name[30],reponse[3],response[3]="yes",temp; int j,i,t=0,k; printf("would you

我用C编写了一个程序,要求用户输入他的名字并输出字母数,然后再次询问用户是否希望将他的名字颠倒过来。如果他的回答是“是”,程序将输出颠倒过来的名字。 问题是我不知道为什么会丢失数组名称中的第一个字母 你可以试试这个代码。我认为scanf是问题的根源

#include <stdio.h>

int main(){
  char name[30],reponse[3],response[3]="yes",temp;
  int j,i,t=0,k;
  printf("would you share with us your name ? \n");
  scanf("%s",name);
  printf("so your name is %s\n",name);
  for(i=0;i<=30;i++){
    if(name[i]!='\0') t++ ;
    else break;
  }
  printf("the number of letters in your name is %d\n",t);
  printf("do you want your name to be scrumbled ?\n");
  scanf("%s",reponse);// I think the problem is here
  for(j=0;j < 3;j++){
    if(response[j]!=reponse[j]) break;
  }
  if(j==3){
    k = t/2;
    for(i=0; i<k;i++){
       temp=name[i];
       name[i]=name[t-i-1];
       name[t-i-1]=temp;
    }
    printf("your new name is %s hahaha ",name);
  }
  else printf("OK");
  return 0;
}
#包括
int main(){
字符名称[30],响应[3],响应[3]=“是”,临时;
int j,i,t=0,k;
printf(“您愿意与我们分享您的姓名吗?\n”);
scanf(“%s”,名称);
printf(“因此您的名字是%s\n”,name);

对于(i=0;i
scanf
不知道目标缓冲区有多大。它会很高兴地将一百万字符串读入一个五字节缓冲区。当它这样做时,它会通过将数据写入目标数组的末尾来破坏内存。您需要显式告诉
scanf
何时停止,以避免数组溢出。例如:例如,
scanf(“%8s”和&var);
用于8字节缓冲区

您的代码似乎重新设计了标准函数,如
strlen
strncmp
。使用标准函数将使您的生活更加轻松


挑剔:你会问“你愿意和我们分享你的名字吗?”,这是一个“是”或“否”的问题。然后你希望用户键入他们的名字,而不是“是”或“否”。你应该改写问题,直接询问名字,以避免任何可能的混淆。

问题似乎是当用户输入字符串时
“是”
存储在数组
reponse[3]
中,然后字符串的终止零覆盖数组
name
中的第一个字符。也就是说,编译器将变量
name
放在内存中变量
reponse
之后

您应该声明数组
response
至少包含四个字符,并在函数scanf的格式说明符中使用字段长度

比如说

char name[30],reponse[4],response[3]="yes",temp;
                     ^^^    

//...

scanf("%3s",reponse); 
      ^^^^

输入字符串的一种更安全的方法是使用标准C函数
fgets

response[3]=“yes”
没有发出警告??拥有名为response的变量以及response的变量是维护的噩梦。你正在自食其果foot@Mohamed您必须声明变量response[3]如果您希望用户输入字符串“yes”,那么至少有四个字符,@vladfromscow您是对的,但我不明白这与名称数组有什么关系???@Mohamed变量response[3]中存储的输入字符串“yes”的终止零覆盖变量名中的第一个字符。即变量名由编译器存储在变量reponse[3]之后。您所说的是正确的,非常有用,但在本例中,“scanf(“%3s”,reponse)”似乎无法解决问题。最好声明reponse[4]实际上,为了存储“\0”@Mohamed,因为它是一个字符串文字,只需使用
const char*response=“yes”
。无需手动为其创建数组。@Mohamed-如果您进行scanf更改,您的代码对我有效()谢谢您的帮助。此解决方案有效