整个数组打印而不是单个值

By simon at 2018-02-28 • 0人收藏 • 23人看过

我需要能够逐个读取文件中的单词,然后才能够读取 将文本排序到一个结构来跟踪多少时代的话已经 不过每当我尝试指向文件中的特定单词时,我都会重复 获得整个文件价值我而不是我正在尝试的特定字词 检索。如果解决方案很简单,我表示歉意,但我仍然与之奋斗 不同类型指针和文件命令

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

char *inputFilename;
char *outputFilename;

char inputText[5000];
char outputText[5000];

int inputFlag;
int outputFlag;

int readfile(char **data){

    FILE *input;
    input = fopen(inputFilename, "rb");
    int len = sizeof(*input);

    printf("input length is %d\n", sizeof(char));

    //First value is number of integers
    int size;
    fread(&size, sizeof(char), 0, input);

    //allocate memory for that number of values 
    *data = (char*)malloc(sizeof(char) * size);

    //Read in rest of data 
    fread(*data, sizeof(char), size, input);

    //return size 
    printf("size is %d\n", size);
    return size;    
}

int valueSearch(char *vData, int argCount, char **argv){

    for(int argLoop = 0; argLoop < argCount; argLoop++){    

        //If vData is detected then the next argument is the input file name 
        if(strcmp(argv[argLoop], vData) == 0){

            return argLoop + 1;

        } 
    }
    return 0;
}

int main(int argc, char **argv){

    char *data;

    inputFlag = valueSearch("-i", argc, argv);

    printf("input flag is %d\n", inputFlag);

    inputFilename = argv[inputFlag];

    if(inputFlag == 0){

        printf("Please enter the text you would like to sort: ");

        fgets(inputText, 5000, stdin);

    }
    else{

        int size = readfile(&data);

    }

    int i = 0;

    //Value that should be placed into struct 
    printf("readfile value 0:\n%s\n", data[i]);

    free(data);

    return 0;

}

3 个回复 | 最后更新于 2018-02-28
2018-02-28   #1

您的最后printf使用%s而不是%c. %s 将参数作为指向字符串的指针(char数组),并打印每个 直到它遇到一个0的字节。你想%c,打印出来 一个字符。

2018-02-28   #2

使用%c而不是%s,因为%s是标识符 的字符串,并会打印整个字符串。

 printf("readfile value 0:\n%c\n", data[i]);
希望它能为你工作。

2018-02-28   #3

您需要熟悉使用compiler warnings进行编译, 然后在编译之前不接受代码出警告或错误。 您可以在19行调用Undefined Behavior,然后再次在线 76使用不当​​的con版本说明符为int (而不是long int - 行19),并再次如前所述 9999999行999376您使用%s而不是%c。 此外,您不包括string.h这是必需的用于 strcmp在线41.没有关于strcmp的声明 所以你的编译器猜测一个implicit声明。 您还会在您的中找到未使用的变量len和size 码。 (行17和69)。 如果你的话,所有这些问题都很容易从你的编译器输出中看到 用999999999983编译0(如果需要-pedantic)gcc, -Weverything在叮当声,或/Wall与VS(cl.exe)(你可能需要/W3 VS,因为/Wall意味着所有(你将拥有 在那里单独禁用一些警告与/wdXXXX在哪里 XXXX是您希望禁用的警告代码)。 虽然不是一个错误,标准的科迪C语言的ng风格避免使用 camelCase或MixedCase有利于所有lower-case的变量名 同时保留_u用于宏和常量的纸张大小写名称。它是一个 风格的问题 - 所以它完全取决于你,但没有遵循低可以 导致某些圈子错误的第一印象。 道德故事 - (1)启用编译器警告,(2)不做不接受代码 直到它完整地编译 - 没有任何警告。让你的编译器帮助你 编写更好的代码将消除一个la您花费的错误的百分比 时间追逐:)

登录后方可回帖

Loading...