整个数组打印而不是其中的单个值

时间:2018-02-27 03:49:24

标签: c arrays

我需要能够一次从一个文件中读取一个单词,然后能够将文本排序到一个结构中,以跟踪单词重复的次数,但每当我尝试指向某个特定单词时在文件中,我获取整个文件值而不是我尝试检索的特定单词。道歉,如果解决方案很简单,我仍然会使用不同类型的指针和文件命令

#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 个答案:

答案 0 :(得分:2)

您的上一次svn使用printf代替%s%c将参数视为指向字符串(char数组)的指针,并打印每个字节,直到遇到0的字节。您需要%s,它打印出一个字符。

答案 1 :(得分:0)

使用%c代替%s,因为%s是字符串的标识符,将打印整个字符串。

 printf("readfile value 0:\n%c\n", data[i]);

希望它适合你。

答案 2 :(得分:0)

您需要熟悉使用编译器警告启用进行编译,然后在没有警告或错误的情况下编译之前不要接受代码。

您通过19使用不正确的转换说明符,在76行调用未定义的行为,然后再次在int行调用<(> 1) long int - 行19)和76行中已注明的内容,您使用%s代替%c

此外,您未在行string.h上添加strcmp所需的41strcmp没有声明,因此您的编译器会对隐式声明进行猜测。

您还会在代码中找到未使用的变量lensize。 (分别为1769行。

如果您使用-Wall -Wextra(如果需要-pedantic)在gcc上编译,并且在{0}上使用-Weverything进行编译,则所有这些问题都会从您的编译器输出中显而易见/Wall与VS(cl.exe){您可能需要/W3在VS上/Wall表示全部(并且您必须单独禁用一些警告{{1}其中/wdXXXX是您要禁用的警告的代码。

虽然不是错误,但C的标准编码样式避免使用XXXXcamelCase变量名来支持所有小写,同时保留用于宏和常量的大写名称。这是一个风格问题 - 所以它完全取决于你,但如果不遵循它可能会在某些圈子中产生错误的第一印象。

故事的道德 - (1)启用编译器警告,以及(2)在完全编译之前不接受代码 - 没有警告。让编译器帮助您编写更好的代码将消除您花费时间追逐的大部分错误MixedCase