对char和char *感到困惑并用文字扫描

时间:2018-06-16 06:49:57

标签: c if-statement char int scanf

我写了这个简单的代码,用一些数字和单词扫描。但是,我很困惑,因为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);
    }
}

3 个答案:

答案 0 :(得分:4)

下面

char *file_name;
char *new_name;

file_namenew_name是char指针,它们未初始化,因此它们不指向任何有效的内存位置;如果你喜欢

scanf("%s", &file_name);
scanf("%s", &new_name);

它会导致分段错误,因为您没有为file_namenew_name分配任何内存。

正确的方法是首先为file_namenew_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_namenew_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'。