C语言中反转字符串的程序
我用C编写了一个程序,要求用户输入他的名字并输出字母数,然后再次询问用户是否希望将他的名字颠倒过来。如果他的回答是“是”,程序将输出颠倒过来的名字。 问题是我不知道为什么会丢失数组名称中的第一个字母 你可以试试这个代码。我认为scanf是问题的根源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
#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;iscanf
不知道目标缓冲区有多大。它会很高兴地将一百万字符串读入一个五字节缓冲区。当它这样做时,它会通过将数据写入目标数组的末尾来破坏内存。您需要显式告诉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更改,您的代码对我有效()谢谢您的帮助。此解决方案有效