当作为指向数组的指针读入时,如何打印文件的名称?

时间:2015-02-02 22:46:27

标签: c pointers formatting printf

因此,在这个程序中,我需要打印用户在运行程序./tstats input.txt时指定的文件名。我的问题是,当我尝试打印出指针指向的内容时,我得到了这个:84 18 407 ffbff2a4。现在我确切地知道前三组数字是什么,但我知道该地址与指针有关。我知道我打印输出的格式需要是字符串格式,但是你不能打印出字符串格式的指针。所以这就是我的问题,如何使用我现在拥有的代码和指向input_from_args src的指针打印出文件的名称?

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


enum state
{
    START,
    WORD,
    DELIM,
};

FILE*
input_from_args(int argc, const char *argv[])
{
    if (argc == 1) {
        return stdin;
    }
    else {
        return fopen(argv[1], "r");
    }
}

void
wcount(FILE *src, FILE *dest)
{
    int ch, wc, lc, cc;
    enum state cstate;

    wc = lc = cc = 0;
    cstate = START;
    while ((ch = fgetc(src)) != EOF){
        cc++;
        switch (cstate) {
            case START:
                if (isspace(ch)) {
                    cstate = DELIM;
                    if (ch == '\n') {
                        lc++;
                    }
                }
                else {
                    cstate = WORD;
                    wc++;
                }
                break;
            case DELIM:
                if (ch == '\n') {
                    lc++;
                }
                else if (!isspace(ch)) {
                    cstate = WORD;
                    wc++;
                }
                break;
            case WORD:
                if (isspace(ch)) {
                    cstate = DELIM;
                    if (ch == '\n') {
                        lc++;
                    }
                }
                break;
        }
    }

    fprintf(dest, "%4d\t%4d\t%4d\t%10p\n", wc, lc, cc, &src);
}
int
main(int argc, const char *argv[])
{
    FILE *src = input_from_args(argc, argv);
    FILE *dest = stdout;

    if (src == NULL) {
        fprintf(stderr, "%s: unable to open %s\n", argv[0], argv[1]);
        exit(EXIT_FAILURE);
    }

    wcount(src, dest);
    fclose(src);

    return EXIT_SUCCESS;
}

编辑问题2代码:

int
main(int argc, char* argv[])
{
	int i;	
	FILE *src = input_from_args(argc, argv);
	FILE *dest = stdout;
	
	
	for (i = 1; i < argc; i++)
	{
		if ((src = fopen(argv[i], "r")) == NULL)
		{
			fprintf(stderr, "%s: unable to open %s\n", argv[0], argv[i]);	
		}
		
		wcount(src, dest, get_filename_from_args(argc, argv[i]));
		fclose(src);
	}
	return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:0)

我的建议:

创建一个函数,返回由wcount打印的文件名:

char* get_filename_from_args(int argc, char* argv[])
{
    static char stdin_name[] = "-";
    if (argc == 1) {
        return stdin_name;
    }
    else {
        return argv[1];
    }
}

更改wcount的签名:

void wcount(FILE *src, FILE *dest, char* src_filename)

将通话更改为wcount

wcount(src, dest, get_filename_from_args(argc, argv));

更改wcount中您写出详细信息的行的实现:

fprintf(dest, "%4d\t%4d\t%4d\t%s\n", wc, lc, cc, src_filename);