【问题标题】:Passing Variables through functions C通过函数 C 传递变量
【发布时间】:2012-04-27 14:40:43
【问题描述】:

您好,我刚开始学习 C,我想知道为什么我在这里遇到问题。 我希望传递一个 char 指针

char *temp;

进入一个函数,即调用函数

checkIfUniqueCourseNo(temp,k);

有原型

int checkIfUniqueCourseNo(char checkchar[4],int);

还有一个函数头

int checkIfUniqueCourseNo(char checkchar[4], int k)

我确定我在这里做了一些非常愚蠢的事情,但我不知道如何解决它:( 提前致谢。 ps 我的错误是 checkchar[4] 输出一个 P...

例子---

temp = "123A"
checkIfUniqueCourseNo(temp,k);

int checkIfUniqueCourseNo(char checkchar[4], int k){
    printf("CheckifUniqueCourse\n");
    printf("Check Value = %c \n", checkchar);

    return 0;
}

输出 = 检查值 = P

【问题讨论】:

  • “输出一个 P”——这是什么意思?请澄清错误是什么。
  • 所以当我 printf checkchar 形成我的 checkIfUniqueCourseNo 函数时。它输出一个p。 @OliCharlesworth
  • 期望会发生什么? “它输出一个 p”并没有给我们任何关于问题所在的线索。 应该输出什么?代码实际上做什么?如果没有这些信息,我们将无法提供任何帮助。
  • 如果您使用printf("%c", checkchar[0]);,那么您只要求打印一个字符。如果你这样做 printf("%s", checkchar); 如果 checkchar 不是以零结尾的,则可能是一个错误。
  • 谢谢@Agent_L 那是我的问题!我输出错了。抱歉问题描述不好

标签: c function pointers chars


【解决方案1】:
temp = "123A" 
checkIfUniqueCourseNo(temp,k);  

int checkIfUniqueCourseNo(char checkchar[4], int k){
  printf("CheckifUniqueCourse\n");
  printf("Check Value = %c \n", checkchar);
                                ^^^^^^^^^
  return 0; 
} 

如果您要打印出checkchar 的第一个字符,则需要将此行更改为任一

printf("Check Value = %c\n", *checkchar);

printf("Check Value = %c\n", checkchar[0]);

在函数参数声明的上下文中,T a[N]T a[] 等价于T *aa 被声明为指向 T 的指针,而不是 T 的数组。

你写的时候

printf("Check Value = %c\n", checkchar);

你骗了printf;你说参数应该是char类型,但你传递了char *。因此是虚假输出。

如果你想打印出整个字符串 "1234",那么你需要把那行改成

printf("Check value = %s\n", checkchar);

这一次我们使用%s 转换说明符告诉printf checkchar 指向一个以0 结尾的char 数组(也称为字符串)。

【讨论】:

  • %s 在这里很危险。当使用 char[4] 时,因为长度被锁定为 4,所以不必担心终止字符串。因此,一旦通过了未终止的四边形(例如 4CC),您就会得到失控的 printf。
  • @Agent_L:他没有通过char[4];他传递了一个char *,在这个例子中指向一个以0结尾的字符串。 checkchar 参数 不是 4 元素数组,尽管有数组表示法;根据 6.7.5.3/7,它是指向 char 的指针。如果他在他的代码中构建了char 的非0 终止数组并且没有告诉我们,那么是的,你是对的。但根据他的例子和描述,我并不太担心。
  • 是的,他做到了——在示例中,temp var 是静态分配的。但我怀疑 [4] 的存在是有原因的。
【解决方案2】:

这一点都不清楚。您是否为temp 分配了任何值?如果有,是什么?

让你的原型更有意义:

int checkIfUniqueCourseNo(char* checkchar, int);

因为完全不清楚你从哪里得到 4。

【讨论】:

  • 我分配给 temp 的值是一个 4 个字符的字符
【解决方案3】:

自从我做 C 以来已经有一段时间了,但我可以在这里看到一些问题,temp = "123A" 实际上需要一个包含 5 个字符的数组(其中一个是包含 '\0' 字符串终止字符)。

其次,printf("Check Value = %c \n", checkchar); 行似乎试图将内存指针打印为字符,将其更改为以下内容:printf("Check Value = %s \n", checkchar); 它将输出数组中的每个字符,直到遇到终止字符。

【讨论】:

    【解决方案4】:

    这里有几件事要看,你需要好好看看你拥有的数据,它是如何表示的以及你想用它做什么。

    您的课程代码似乎是一个四字符的字符串,您应该知道,传统上,C 中的字符串在末尾还包含一个额外的字节,其值为零 (NUL),因此许多存在的字符串函数知道它们已经到达字符串的末尾。

    在您的情况下,您的四位代码占用了五个字节的内存。所以不适合将它传递给你的函数。

    如果我是你,我会像这样传递一个指针:-

    int checkIfUniqueCourseNo(char* coursecode, int k ) {
      int rv = -1;
      if ( coursecode == NULL ) return rv;
      //...
    

    我不知道 K 是干什么用的,是吗?

    一旦你的函数中有字节序列,你就可以通过对数据进行一些简单的边界检查来省去很多麻烦,如下所示:

      //...
      if ( strlen(coursecode) > 4 ){
        fprintf(stderr,"course code too long\n");
        return rv;
      }
    
      if ( strlen(coursecode) < 4 ){
        fprintf(stderr,"course code too short\n");
        return rv;
      }
      //...
    

    你现在可以确定你有一个 4 个字符的字符串了..

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      相关资源
      最近更新 更多