使用指针从一个void函数到另一个函数的值?

时间:2016-12-29 00:15:57

标签: c

我环顾四周但似乎无法找到如何做到这一点。我希望test2(int *f)的空行值传递给test1()并打印在屏幕上。

代码的变体1:

#include <stdio.h>
#include <string.h>
void test1();
void test2(int *f);
void test1(){
    int a;
    test2(&a);
    printf("%d \n", a);
}
void test2(int *f){
    char str[80];
    int lines, i,  emptylines=0;
    *f=emptylines;
    printf("Type a program here. Ctrl+Z and enter to stop.\n");
    fflush(stdin);
    while(gets(str)!=NULL && strcmp(str, "qq")) {
        for(i=0; i<strlen(str); i++){
            if(str[i]!='\n') lines=1;
        }
        if(!lines) emptylines++;
            lines=0;
    }
}
int main() {
    test1();
    return 0;
}

代码的变体2:

#include <stdio.h>
#include <string.h>
void test1();
void test2(int *f);
void test1(){
    int a;
    test2(&a);
    printf("%d \n", a);
}
void test2(int *f){
    char str[80], *p;
    int lines, emptylines=0;
    *f=emptylines;
    printf("Type a program here. Ctrl+Z and enter to stop.\n");
    fflush(stdin);
    while(gets(str)!=NULL && strcmp(str, "qq")) {
        p=str;
        lines=0;
        while(*p!='\0') {
            if(*p!=' ') {
                lines=1;
            }
            p++;
        }
        if(lines==0){
            emptylines++;
            lines=0;
        }
    }
}
int main() {
    test1();
    return 0;
}

3 个答案:

答案 0 :(得分:4)

您将*f=emptylines放在函数的开头void test2(int *f);然后计算emptylines,但这不会影响f指向的值。

您需要将该作业*f=emptylines移至功能的结尾,就在返回之前,计算emptylines之后

void test2(int *f){
    // stuff to calculate emptylines
    ....

    *f=emptylines; // at the end
}

答案 1 :(得分:3)

写作时

*f = emptylines;

您正在将空行的值复制到f指向的空间中。然后,当您稍后更新空行时,f指向的值不会因为您制作副本而发生更改。

答案 2 :(得分:1)

不要使用其他变量emptylines,而是直接使用参数f来计算值。虽然我给它提供了比f更具描述性的价值,例如numEmptyLines

 #include <stdio.h>
#include <string.h>
void test1();
void test2(int *numEmptyLines);
void test1(){
    int a;
    test2(&a);
    printf("%d \n", a);
}
void test2(int *numEmptyLines){
    char str[80];
    int lines, i;
    *numEmptyLines = 0;
    printf("Type a program here. Ctrl+Z and enter to stop.\n");
    fflush(stdin);
    while(gets(str)!=NULL && strcmp(str, "qq")) {
        for(i=0; i<strlen(str); i++){
                            if(str[i]!='\n') lines=1;
            }
            if(!lines) (*numEmptyLines)++;
                lines=0;
    }
}
int main() {
    test1();
    return 0;
}