【问题标题】:pointers to an array only print the first character?指向数组的指针只打印第一个字符?
【发布时间】:2015-04-18 01:41:49
【问题描述】:

刚开始学习 c.我对指针和数组感到困惑。 这是我的主要功能。

int next_statement(char *a, int n);
void consume_char(char c);
int var_lib_check(char type,char var);

int
main(int argc, char *argv[]) {
char statement[MAX_LINE];
int statement_len;
char type[MAX_LINE];
char var[MAX_LINE];

/* Print the output header comment */
printf(OUTPUT_HEADER, argv[0]);

/* Loop through statements read on stdin */
while ((statement_len = next_statement(statement,MAX_LINE)) > 0) {
    printf("%s\n",statement);
    sscanf(statement,"%s %s",type,var);
    var_lib_check(*type,*var);
}
return 0;

int
var_lib_check(char type,char var){
char var_library[MAX_VARS][MAX_LINE];
char new_var[MAX_LINE];
int num_of_var;
int z;
num_of_var = 0;

printf("%s and %s",&type,&var);
if (strcmp(&type,DOUBLE_TYPE)==0||strcmp(&type,INT_TYPE)==0||
        strcmp(&type,RTRN_TYPE)==0){
    for (z= 0; z < num_of_var; z++){
        if (strcmp(var_library[z],&var) == 0){
                sprintf(new_var,"x%d",z);
                printf("%s %s",&type,new_var);
                return z;
        }
    }
    strcpy(var_library[num_of_var],&var);
    num_of_var += 1;
    sprintf(new_var,"%x%d",num_of_var);
    printf("%s %s",&type,new_var);
        }
return num_of_var;
}

该程序读取输入,如果它是 int 或 double ...它将替换为例如整数 x0。

为什么它应该打印整个字符串却在运行函数时只打印类型和变量的第一个字母?

int
next_statement(char *a, int n) {
    int c, i;
    for (i=0; i < n && (c = getchar()) != EOF; i++) {
        if (c == CHAR_SEMI) {
            consume_char('\n');
            break;
        }
        a[i] = c;
    }
    if (c == CHAR_SEMI) {
        a[i] = '\0';
        return i; /* index when ; was read, so the length of saved. */
    }
    else if (i >= n) {
        printf("%s Line too long.\n", ERROR_PREFIX);
        exit(EXIT_FAILURE);
    }
    return 0;
}



/* reads one char from stdin and errors if it is not what was
 * expected, thereby "consuming" the given char.
 */
void
consume_char(char c) {
    int x;
    if ((x=getchar()) != c) {
        printf("%s expected '%c' found '%c'.\n", ERROR_PREFIX, c, x);
        exit(EXIT_FAILURE);
    }
    return;

【问题讨论】:

  • 你不应该将变量的地址传递给printf()
  • @user3121023 我试过了,但它仍然没有改变任何东西。让我发布我的其余代码。
  • @user3121023 抱歉,我还不能发布另一个问题。我尝试将 new_var、var_library 和 num_of_var 设为静态。但输出保持不变。
  • @user3121023 删除 num_of_var 修复了它。但为什么呢?你能解释一下吗?

标签: c


【解决方案1】:

你的函数定义为

int var_lib_check(char type,char var){

你称之为

var_lib_check(*type,*var);

通过这样做,您只传递了一个字符,而不是整个字符串。

你应该改变你的功能

    int var_lib_check(char *type,char *var)

并将其称为

    var_lib_check(type,var);

现在,您将字符串传递给它,您可以像指针一样处理它。

【讨论】:

  • 感谢它修复了该部分。但是现在,每次我输入新输入时,循环都会替换我的 var_library 中的字符串。当我输入 int hello;它打印出 int hello\n int x0。然后我输入双蓝;当它应该是 x1 时,它会打印出双蓝色\n 双 x0。我该如何解决这个问题?
【解决方案2】:

这是因为您只将第一个 char 传递给 var_lib_check()。你必须传递数组,所以首先修复这个

var_lib_check(*type,*var);

做起来

var_lib_check(type,var);

然后修复var_lib_check()函数

int
var_lib_check(char *type, char *var)
{
    char var_library[MAX_VARS][MAX_LINE];
    char new_var[MAX_LINE];
    int num_of_var;
    int z;
    num_of_var = 0;

    printf("%s and %s", type, var); /* remove the & */
    if (strcmp(type, DOUBLE_TYPE) == 0 || strcmp(type, INT_TYPE) == 0 || \
            strcmp(type, RTRN_TYPE)==0)
    {
        for (z = 0 ; z < num_of_var ; z++)
        {
            if (strcmp(var_library[z], var) == 0)
            {
                sprintf(new_var, "x%d", z);
                printf("%s %s", type, new_var);
                return z;
            }
        }
        strcpy(var_library[num_of_var], var);
        num_of_var += 1;
        sprintf(new_var, "%x%d", num_of_var);
        printf("%s %s", type, new_var);
    }
    return num_of_var;
}

大部分代码会调用未定义的行为,因为您将地址传递给 char,其中需要指向字符串的指针。

字符串由一系列非nul 字节后跟nul 字节组成,因为您将地址传递给仅一个字节的函数,即printf()strcmp(),其中读取过去传递变量的值。

【讨论】:

  • 感谢它修复了该部分。但是现在,每次我输入新输入时,循环都会替换我的 var_library 中的字符串。当我输入 int hello;它打印出 int hello\n int x0。然后我输入双蓝;当它应该是 x1 时,它会打印出双蓝色\n 双 x0。我该如何解决这个问题?
  • 您需要检查获取输入的代码中的错误,我认为您的字符串是free()d 或在某处被释放。
  • 对不起,我不明白解除分配字符串的含义。
  • 也许你将字符串声明为函数内的数组并返回地址,我建议启用编译警告。
猜你喜欢
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
相关资源
最近更新 更多