在C中反转字符串的程序

时间:2017-03-01 20:59:11

标签: 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 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;
}

2 个答案:

答案 0 :(得分:1)

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

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

例如

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

//...

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

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

答案 1 :(得分:0)

scanf不知道您的目标缓冲区有多大。它很乐意将一百万个字符的字符串读入一个五字节的缓冲区。当它执行此操作时,它会通过将数据写入目标数组的末尾来破坏内存。您需要明确告诉scanf何时停止以避免阵列溢出。例如,scanf("%8s", &var);表示8字节缓冲区。

您的代码似乎重新发明了strlenstrncmp等标准功能。使用标准功能将使您的生活更轻松。

Nitpick:你问&#34;你会和我们分享你的名字吗?&#34;,这是&#39;是&#39;或者没有&#39;题。然后,您希望用户输入他们的姓名,而不是&#39;是&#39;或者没有&#39;。您应该重新提出问题,直接询问姓名,以避免任何可能的混淆。