我在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;
}
答案 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字节缓冲区。
您的代码似乎重新发明了strlen
和strncmp
等标准功能。使用标准功能将使您的生活更轻松。
Nitpick:你问&#34;你会和我们分享你的名字吗?&#34;,这是&#39;是&#39;或者没有&#39;题。然后,您希望用户输入他们的姓名,而不是&#39;是&#39;或者没有&#39;。您应该重新提出问题,直接询问姓名,以避免任何可能的混淆。