在单独的文件中创建新函数并使用头文件

时间:2016-09-26 08:34:00

标签: c

我的下一步是将我的程序分解为主代码之外的几个函数,spate文件和头文件。

我移动的第一个函数是更改为大写函数,这很有用。

我现在尝试创建一个新函数来执行从摩尔斯电码到字母数字的转换。似乎有很多错误。

我附上了我的主程序,然后是函数程序,后跟头文件。

主程序

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

#include "morse.h"

int main(void)
{

char *morse[] = {"/",".-","-...","-.-.","-..",".","..-.","--        .","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-        .","...","-","..-","...-",".--","-..-","-.--","--..","-----",".----        ","..---","...--","....-",".....","-....","--...","---..","----."};
char *alpha[] =  {" ", "A", "B",    
    "C",   "D",  "E","F",   "G",  "H",   "I", "J",   "K",  "L",   "M", "N",         "O",  "P",   "Q",   "R",  "S",  "T","U",  "V",   "W",  "X",   "Y",   "Z"        ,   "0",    "1",    "2",    "3",    "4",    "5",    "6",    "7",    "8",         "9"};


  char *print_array[50];
  int print_array_index = 0;

  char hold[50];
  int hold_index = 0;

  char input[200];
  int i = 0;

//Requesting input from the user
printf("Welcome to the Morse translator.\n");
    printf("Enter input: ");
    fgets(input, sizeof(input), stdin);

// Call to a function that converts user input to UPPERCASE
turnUpCase(input);

    if (input[0]=='-' || input[0]=='.')
    {
    //Calls the function to convert Morse code to Alpha
    morseToAlpha(input, *alpha, *morse);
}
    // this section is now in a seperate function
/*      while (input[i] !='\0') {

        if (input[i] ==' ' || input[i] == '\n')
        {
            hold[hold_index] = '\0';

            bool found = false;

            for (int x = 0; x < sizeof(morse) / sizeof(char *); x++)
            {
                if (strcmp(morse[x], hold) == 0)
                {
                    print_array[print_array_index++] = alpha[x];

                    found = true;

                    break;
                }
            }

            if (!found)
            {
                fprintf(stderr, "Invalid Morse code!");
                return 0;
            }

            hold_index = 0;
        }
        else
        {
            hold[hold_index++] = input[i];
        }

        i++;
    }
    for (int x = 0; print_array_index > x; x++)
    //for (int x = 0; x < print_array_index; x++)
    {
        printf("%s", print_array[x]);

    }

    printf("\n");
}

*/

else if (isalnum(input[0]))
{
    while (input[i]!='\0' && input[i] !='\n')
    {
        bool found = false;

        for (int x=0; x < sizeof(alpha)/sizeof(char*);x++)
        {
            if (*alpha[x]==input[i])
            {
                print_array[print_array_index++] =
   morse [x];


                found = true;
                break;
            }
        }
        if (!found)
        {
            fprintf(stderr, "Invalid input!\n");
            return 0;
        }
        i++;

    }
    printf("%s",print_array[0]);
    for (int x=1; x < print_array_index; x++)
    {
        printf(" %s",print_array[x]);
    }
    printf("\n");
}           
    return 0;
}

我的功能导致错误

#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
#include"morse.h"


void morseToAlpha(char *in, char *letters, char *code)
{
int i=0;
int x=0;

char *print_array[50];
int print_array_index =0;

char hold[50];
int hold_index = 0;



while (in[i] !='\0') 
{

        if (in[i] ==' ' || in[i] == '\n')
        {
            hold[hold_index] = '\0';

            bool found = false;

            for (int x = 0; x < sizeof(code) / sizeof(char *); x++)
            {
                if (strcmp(*code[x], hold) == 0)
                {
                    print_array[print_array_index++] = letters[x];

                    found = true;

                    break;
                }
            }

            if (!found)
            {
                fprintf(stderr, "Invalid Morse code!");
                return 0;
            }

            hold_index = 0;
        }
        else
        {
            hold[hold_index++] = in[i];
        }

        i++;
    }
    for (int x = 0; print_array_index > x; x++)
    //for (int x = 0; x < print_array_index; x++)
    {
        printf("%s", print_array[x]);

    }

    printf("+++++\n");
}

当前编译错误

morseToAlpha.c:在函数'morseToAlpha'中: morseToAlpha.c:32:29:错误:一元'*'的无效类型参数(有'int')

if(strcmp(* code [x],hold)== 0) ^ morseToAlpha.c:34:55:警告:赋值从整数中生成指针而没有强制转换[-Wint-conversion] print_array [print_array_index ++] = letters [x]; ^ morseToAlpha.c:45:13:警告:'return'带有一个值,函数返回void 返回0; ^

3 个答案:

答案 0 :(得分:1)

您在此处创建的内容:

char *morse[]....;
char *alpha[]....;

不是指向数组的指针。它被读作,

(char *)(morse[])..;
(char *)(alpha[])..;

*morse是指向char的指针。

在函数strcmp(*code[x], hold)中,

code是指向char的指针。

code[x]char

但你正在做*code[x]

产生相同错误的示例是,

int main() {
    char c = 'h';
    printf("%c\n", *c);
}

答案 1 :(得分:0)

我不确定你的问题是什么,但这就是我的想法。

使用单独的文件拆分您的工作,并在标题文件中放置不同的function prototype

如果项目很小,你可以将所有内容放在同一目录中,如果项目较大,最好分成多个目录并使用Makefile编译你的项目。

srcs/file1.c
srcs/fileX.c
incs/header.h
Makefile

问题标题是:在单独的文件中创建新函数并使用头文件

所以在这种情况下。我们会将您的主要功能放在main.c文件中,并将{morseToAlpha放在morse.c中,并将morse转换为头文件中的alpha原型morse.h

使用以下命令编译项目:

gcc -Wall -Wextra -Werror main.c morse.c morse.h

但你应该看看how to build a Makefile

答案 2 :(得分:0)

代码:

char *morse[] = {"/", ...};
char *alpha[] = {" ", ...};

首先将morsealpha声明为char的指针数组,然后初始化这些数组。现在,像"/"这样的字符串文字实际上是一个字符数组:"/" = {'/', '\0'}。因此,要填充指向char的指针的数组morse被初始化为包含指向char的指针(即指向字符文字'/'的指针)作为其第一个元素。

如果要使用函数处理数组,可以使用数组名称调用函数,并将指向数组第一个元素的指针传递给函数。所以你的函数调用应该如下:

morseToAlpha(input, alpha, morse);

这会传递一个指向input [0]的指针,这是一个指向char的指针,一个指向alpha [0]的指针,它指向指向char的指针(即指向字符串的指针)和指针莫尔斯[0],也是指向char的指针。因此,您的函数应声明为:

void morseToAlpha(char *in, char **letters, char **code);

我希望这会有所帮助:)