需要"指出"在正确的方向开始C编程

时间:2017-05-08 03:17:28

标签: c arrays function pointers multidimensional-array

感谢您的时间。我提前道歉我是C编程的新手,并在堆栈溢出时发布。我可能遗漏的任何信息和您提出的问题请询问。

我有这个实验室,我正在为我的班级工作,而我却无法理解可怕的指针是如何运作的。首先,我将解释实验室说明。

首先,我要为null创建一个200字的数组,最大长度为30 + 1。 接下来,我需要创建的调用函数包括:

  1. 读取函数,它将文件中的单词读入数组。我必须使用fopen和fscanf函数。
  2. 使用每个字符的ASCII代码将字符串转换为小写的函数。 (必须使用指针)
  3. 一个返回字符串长度的函数。(不能使用strlen函数,必须使用指针)
  4. 具有三个参数的函数(单词数组,数组中的单词数和int长度)。函数返回数组中与int length匹配的数字。
  5. 用于打印数组中所有单词的打印功能。
  6. 我使用的IDE是Dev C ++,它很不稳定所以我也一直在使用netbeans。 我只尝试创建读取,打印和转换为小写函数。我首先尝试读取文件并在main中打印数组。我正在阅读的文件是由我创建的,它包含一个完整的短句:

    • HERE中有很多单词

    编辑 - 将主代码更新为当前主内部的小写循环。

    #define rows 200    //How many words allowed in array.
    #define cols 31     //How many characters allowed for each word.
    
    void lowercase(char* words, int count);
    int read(char (*words)[cols]);
    void print(char (*words)[31], int count);
    
    int main(int argc, char *argv[]){
        char words[rows][cols];
        int i, j;   
        int count = read(words);
    
        print(words, count);
    /*
        //make words lowercase
        for(i = 0;i<count;i++){
            for(j = 0;j<cols;j++){
                if(words[i][j]!=0){
                    if(words[i][j]<91 && words[i][0]>64)
                        words[i][j] = words[i][j]+32;
                }
            }
        }*/
    
        for(i = 0;i < count;i++){
            lowercase(*words+i, count);
        }
        print(words, count);
    
        return 0;
    }
    

    代码写得不好并且管理得当,我只是想让一切工作先行,然后才会更合适。第一个printf输出结果如何:

    数组[0]:有

    数组[1]:ARE

    数组[2]:所以

    数组[3]:很多

    数组[4]:单词

    数组[5]:在

    数组[6]:这里

    然后打印功能我在数组中正确打印出单词,但它包含每个单词的所有30个空格而不是单词。这就是它的编写方式我需要改变它。

    void print(void *array, int SIZE){
        int i,
            j;
    
        char *charArray = (char *) array;
    
        for( j = 0; j < SIZE; j++ ){
            for( i = 0; i < SIZE; i ++){
                printf( "%c ", charArray[j*SIZE + i] );
            }
            printf( "\n" );
        }
    }
    

    我创建的tolower函数部分地将每个单词的第一个字母转换为小写。现在它破了,不记得我改变了什么。

    EDIT-更新小写功能。 main中的小写字母完全正常工作,但是使用此功能时,它不会将所有单词转换为小写,而是在第三个单词处停止,其余单词则相同。

    void lowercase(char *words, int count){
        int j;
    
        for(j = 0;j<cols;j++){
            if(words[j]!=0){
                if(words[j]<91 && words[j]>64)
                    words[j] = words[j]+32;
            }
        }
    }
    

    我试图将main中的读取代码移动到它自己的函数中,同时尝试使用指针模拟打印代码但是当我运行程序时它停止并且exe文件停止工作窗口弹出命令提示符。 IDE中没有错误或警告。

    int read(void *array){
        FILE *file;
        int i,
            j;
    
        char *words = (char *) array;
        file = fopen("words.txt", "r");
        //STORE IN ARRAY
        for(i=0;i<7;i++)
            fscanf(file,"%s", words[i]);
    }
    

    如果你还没弄明白我不知道何时或如何使用指针或地址。基本上12小时我基本上都学过C语言,在我看来,没有足够的时间学习语言,特别是有效地理解语言。任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:2)

通过将二维数组向下投射到char*,您丢失了一些信息。如果您正确读取了单词,那么在内存中,您的数组可能如下所示:

0         10        20        30
|.........|.........|.........|.
There
ARE
so
MANY
words
in
HERE

要访问words[1],编译器会自动从数组的开头偏移31个字节。

你的问题是,在你将words转换为char*之后,编译器不再知道2D结构,而words[1]现在只会偏离开始时的1个字节。阵列。

一个简单的解决方案是重新定义read函数:

int read(char words[][31])
{
    FILE *file;
    int i, j, count = 0;
    file = fopen("words.txt", "r");
    for (i=0; i<7; i++)
    {
        count += (1 == fscanf(file, "%s", words[i]));
    }
    return count;
}

现在编译器知道words[i]的内存跨度大小是31 char值。

print类似的事情:

void print(char words[][31], int count)
{
    int i;
    for( i = 0; i < count; i ++)
    {
        printf( "%s\n", words[i] );
    }
}

答案 1 :(得分:2)

像这样解决:

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

//Stringification
#define S_(n) #n
#define S(n) S_(n)

//Information to be shared across the whole area
#define MAX_ROWS 200
#define MAX_WORD_LENGTH 30
#define COLS (MAX_WORD_LENGTH + 1)

#define DATA_FILE "words.txt"

int read(void *array);
void print(void *array, int rows);

int main(void){
    char words[MAX_ROWS][COLS];
    int rows;

    rows = read(words);
    print(words, rows);

     return 0;
}

int read(void *array){
    FILE *file = fopen(DATA_FILE, "r");
    if(file == NULL){
        perror("fopen:");
        exit(EXIT_FAILURE);
    }
    char *words = array;
    int rows;
    for(rows = 0; rows < MAX_ROWS; ++rows, words += COLS){
        if(fscanf(file, "%" S(MAX_WORD_LENGTH) "s", words) == EOF)
            break;
    }
    fclose(file);
    return rows;
}

void print(void *array, int rows){
    char *words = array;
    for(int r = 0; r < rows; ++r, words += COLS){
        printf("Array [%d]: %s\n\n", r, words);
    }
}