【问题标题】:string as a argument in a function in c字符串作为c函数中的参数
【发布时间】:2014-04-10 21:47:25
【问题描述】:

我正在制作一个函数,用于根据其行号和字段号从文本文件中检索整数。

代码如下所示,主要问题是函数参数有问题。

我在return value; 有一个错误标志,上面写着:value 未声明

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* define function */
int getlinefieldint(const char FILENAME[], int TARGETLINE, int TARGETFIELD, int LINESIZE);

int main ()
{
    static const char FILENAMEint[] = "resultdata1M";
    int linea=1000;
    int campo=2;
    int tamanolinea=128;
    int value;
    value=getlinefieldint(FILENAMEint,linea,campo,tamanolinea);
    printf("%d",value);

    return 0;
}

/* declare function */
int getlinefieldint(const char FILENAME[], int TARGETLINE, int TARGETFIELD, int LINESIZE)
{
    FILE *ARCHIVO;
    ARCHIVO = fopen ( FILENAME, "r" );       
    int C,QUERY_GENE_NUM;
    unsigned int NEWLINE_COUNT = 0;
    while ( (C=fgetc(ARCHIVO)) != EOF )
    {
        if ( C == '\n' )
        {
        NEWLINE_COUNT++;
        }
    }
    printf("La cantidad de genes a evaluar es: %d\n",QUERY_GENE_NUM);
    rewind(ARCHIVO);

    if (TARGETLINE <= NEWLINE_COUNT)
    {
        int j,value;
        int stoplimitline;
        char LINE[LINESIZE];
        char *BUFFER;
        char *TOKEN_SEPARA;
        char *RETURNPTR;
        BUFFER=(char *)malloc(24 * sizeof(char));
        RETURNPTR=(char *)malloc(24 * sizeof(char));
        while (stoplimitline < TARGETLINE)
        {
            fgets(LINE, sizeof LINE, ARCHIVO);
            puts(LINE);
        }
        TOKEN_SEPARA = strtok(LINE, " ");
        for (j=1;j<=TARGETFIELD;j++)
            {
                if(j!= TARGETFIELD)
                {
                    BUFFER=strcpy(RETURNPTR,TOKEN_SEPARA);
                    puts(BUFFER);
                    TOKEN_SEPARA = strtok(NULL, " ");   /* hacer que brinque el puntero al siguiente patron */
                }
                else
                {
                    value=atoi(BUFFER);
                }
            }


    }

    return value ;
}

【问题讨论】:

  • 那是因为它是在块内声明的,因此范围有限,而不是在函数代码的开头。因此,return 语句无法访问它。

标签: c string function


【解决方案1】:

你的问题在这里:

if (TARGETLINE <= NEWLINE_COUNT)
{
    int j, value;
    // ...
}
return value;

请注意,在 C(和许多其他语言)中,变量仅“存在”在声明它们的代码块中。因此,如果您在代码块中声明变量(例如 ifwhilefor 代码块),那么当程序离开该代码块时,该变量将根本不存在。

这里的简单解决方案是在输入if 块之前声明int value

int value;
if (TARGETLINE <= NEWLINE_COUNT)
{
    int j;
    // ...
}
return value;

【讨论】:

    【解决方案2】:

    value 将不复存在一次

    if (TARGETLINE <= NEWLINE_COUNT)
    

    超出范围,因为value 的声明在if 语句内。

    return 语句在if 语句之外,这意味着即使value 不存在,也会尝试返回它。

    【讨论】:

    • 好的,我的答案与其他答案涵盖的信息相同,而且它也排在第一位。那么它有什么不好以至于值得一票否决呢?
    • 这不太正确。 C 中的变量是词法范围的,因此即使您输入 if 语句,只要您离开该块并继续前进,在 if 块中声明的任何变量都将超出范围(并因此停止存在)。变量永远不会存在于声明它的代码块之外。
    • @Frxstrem 好的,我解决了这些问题。感谢您的回复。
    【解决方案3】:

    value 的声明放在if 块之外。

    /* declare function */
    int getlinefieldint(const char FILENAME[], int TARGETLINE, int TARGETFIELD, int LINESIZE)
    {
        FILE *ARCHIVO;
        int value = 0; //or whatever default value it should have
    

    【讨论】:

      最近更新 更多