Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由于不相关的函数调用,C字符串被垃圾值填充_C_String_User Input - Fatal编程技术网

由于不相关的函数调用,C字符串被垃圾值填充

由于不相关的函数调用,C字符串被垃圾值填充,c,string,user-input,C,String,User Input,我试图使用一个干净的方法将所有用户输入传递到程序的不同部分 然而,有一个bug。我的问题是,包含用户参数之一的字符串似乎毫无理由地被转换为垃圾值 在send函数内部调用无关函数之前,字符串是完美的,之后,它将被垃圾值填充 提供了一个有此问题的更大项目的清理代码段。仅显示与此问题相关的代码 这是在ubuntu上发生的 //weirdInputBug.c #包括 #包括 typedef结构用户输入{ char command;//表示要执行的命令的字符 int-argument1; int intA

我试图使用一个干净的方法将所有用户输入传递到程序的不同部分

然而,有一个bug。我的问题是,包含用户参数之一的字符串似乎毫无理由地被转换为垃圾值

在send函数内部调用无关函数之前,字符串是完美的,之后,它将被垃圾值填充

提供了一个有此问题的更大项目的清理代码段。仅显示与此问题相关的代码

这是在ubuntu上发生的

//weirdInputBug.c
#包括
#包括
typedef结构用户输入{
char command;//表示要执行的命令的字符
int-argument1;
int intArgument2;
字符*strArgument2;
}用户输入;
//这将强制编译器使用寄存器中的所有3个变量
使用多个参数的int函数(int a、int b、int c){
返回a;
}
无效发送(int-pid,char*msg){
printf(“函数调用前发送中的消息:%s\n”,msg);fflush(stdout);
//强制编译器/程序使用前3个变量寄存器
INTA、b、c;
使用多个参数(a、b、c)的函数;
printf(“函数调用后发送的消息:%s\n”,msg);fflush(stdout);
返回;
}
//返回用户的命令
UserInput getUserInput(){
//初始化变量并获取用户输入
char-msg[40];
printf(“请键入\“s1 hi\”:”);
fflush(stdin);
scanf(“%s”,msg);
msg[0]=toupper(msg[0]);
//初始化结构变量
char命令;
int argument1=-1;
int intArgument2=-1;
char strArgument2[40]=“”;
//分配结构变量
command=msg[0];
scanf(“%d”和“&1”);
scanf(“%39s”,strArgument2);
//返回已完成的结构
返回(UserInput){command,argument1,intArgument2,strArgument2};
}
int main(){
//获取用户的输入
UserInput UserInput=getUserInput();
//根据命令选择程序执行的操作
开关(userInput.command){
案例S:
printf(“main中的消息:%s\n”,userInput.strArgument2);fflush(stdout);
发送(userInput.argument1,userInput.strArgument2);
打破
违约:
打破
}
}
生成文件:

run: weirdInputBug.c
    gcc -o run weirdInputBug.c -I.
过程输出:

sephorol@ubuntu:~/Downloads/help$ ./run
Please type "s 1 hi": s 1 hi
msg in main: hi
msg in send before function call: hi
msg in send after function call: 0����

charstrargument2[40]这是一个局部变量,存储在堆栈上。函数
getUserInput()
返回指向该局部变量的结构,其作用域位于左侧。当第一次调用
printf
时,这只是一个幸运的时刻。当第二次调用
printf
时,堆栈包含垃圾数据,结构指向该垃圾字符串值

您正在从
strArgument2
中的
getUserInput()
返回一个指向局部变量的指针,因此它会被置乱,因为它不再有效。罪魁祸首可能是
printf()
;在
send()
顶部重复对它的调用将确认这一点。
getUserInput
返回一个
UserInput
结构,该结构具有指向
getUserInput
函数(
strArgument2
)的本地变量的指针。未定义的行为。作为奖励,您还可以执行
fflush(stdin)
,这也是未定义的行为。请小心。