我写了这个简单的代码,用一些数字和单词扫描。但是,我很困惑,因为char总是给我一个错误。这有什么问题?
int main(int argc, char *argv[]) {
int val_pos, incr_val, max_val;
char *file_name;
char *new_name;
if (argc == 6) {
val_pos = atoi(argv[1]);
incr_val = atoi(argv[2]);
max_val = atoi(argv[3]);
file_name = argv[4];
new_name = argv[5];
} else {
printf("Command usage: %s <val_pos> <increment val> <max val> <file_name> <new name>\n", argv[0]);
printf("What is the position you want to change? Enter your number\n");
printf("X = 0 | Y = 1 | Z = 2\n");
scanf("%d", &val_pos);
printf("What is the increment value?\n");
scanf("%d", &incr_val);
printf("What is the max value/value we should terminate at?\n");
scanf("%d", &max_val);
printf("What is the pose file called?\n");
scanf("%s", &file_name);
printf("What should we call the newly generated files?\n");
scanf("%s", &new_name);
}
}
答案 0 :(得分:4)
下面
char *file_name;
char *new_name;
file_name
和new_name
是char指针,它们未初始化,因此它们不指向任何有效的内存位置;如果你喜欢
scanf("%s", &file_name);
scanf("%s", &new_name);
它会导致分段错误,因为您没有为file_name
和new_name
分配任何内存。
正确的方法是首先为file_name
和new_name
分配内存,然后扫描数据
char *file_name = malloc(F_SIZE); /* define F_SIZE */
char *new_name = malloc(N_SIZE); /* define the N_SIZE as how much size you want */
现在扫描数据,如
scanf("%s",file_name); /* & is not required */
scanf("%s",new_name);
使用file_name
和new_name
完成后,请不要忘记通过调用free()
来释放动态内存以避免内存泄漏,例如
free(file_name);
free(new_name);
旁注:您的编译器可能已经警告过您
scanf("%s", &file_name); /* & is not needed */
像
格式'%s'需要'char *'类型的参数,但参数2有 输入'char **'
也是关于
char *file_name; /* uninitialized */
'file_name'可以在此函数中未初始化使用
如果您使用适当的标志编译代码。我建议你用
编译任何基本的C代码gcc -Wall -Wstrict-prototypes -Werror test.c
它可以帮助你很多,因为有时人们习惯于从字面上采取警告,但后来花费更多。因此,通过使用-Werror
&amp;编译器更好地将警告转换为错误继续。
答案 1 :(得分:1)
对于这些值:
printf("What is the pose file called?\n");
scanf("%s", &file_name);
printf("What should we call the newly generated files?\n");
scanf("%s", &new_name);
你已经声明了指针
char *file_name;
char *new_name;
因此,首先,变量已经是指针,因此您不需要使用&
运算符的地址:
printf("What is the pose file called?\n");
scanf("%s", file_name);
printf("What should we call the newly generated files?\n");
scanf("%s", new_name);
第二,你没有分配任何内存来保存你的字符串,例如:
file_name = malloc(50); // choose appropriate sizes
// check for NULL
new_name = malloc(50);
// check for NULL
答案 2 :(得分:0)
更改
scanf("%s", &file_name);
scanf("%s", &new_name);
要
scanf("%s", file_name);
scanf("%s", new_name);
您必须为 file_name 和 new_name 分配内存,以便向他们写入数据。
你最好在每次scanf()之后附加getchar()
来获取由 ENTER 键生成的'\ n'。