Arrays 使用%s格式说明符时发生读取访问冲突

Arrays 使用%s格式说明符时发生读取访问冲突,arrays,c,Arrays,C,我一直在尝试编写一个以字符串作为输入的程序,而输出将是用莫尔斯电码编写的相同字符串,但是在使用%s格式说明符和*(摩尔斯+I)时,会出现读取访问冲突 #包括 #包括 #包括 #杂注警告(禁用:4996) 无效代码(字符[],常量字符*mors){ char-arr[256]; printf(“要编码的字符串:\n”); fgets(arr,256,标准DIN); 对于(int计数器=0;计数器

我一直在尝试编写一个以字符串作为输入的程序,而输出将是用莫尔斯电码编写的相同字符串,但是在使用%s格式说明符和*(摩尔斯+I)时,会出现读取访问冲突

#包括
#包括
#包括
#杂注警告(禁用:4996)
无效代码(字符[],常量字符*mors){
char-arr[256];
printf(“要编码的字符串:\n”);
fgets(arr,256,标准DIN);
对于(int计数器=0;计数器
代码中的两个主要问题-

First,这里是传递
mors
字符串数组的第一个字符串-

code(litery, *mors);
*mors
more[0]
相同,也就是说,您在这里传递指针指向
0
th索引的字符串,即字符串
“-”
。相反,您应该传递整个
mors
数组

应该是

code(litery, mors);
             ^^^^
您还必须修改
code()
函数的第二个参数的类型才能接收
mors
字符串数组,如下所示

void code(char litery[], const char** mors)
                                   ^^ 
,而不是将
arr[i]
litery[i]
进行比较,您应该将
arr
计数器索引处的数组元素与
litery[i]

            if (arr[counter] == litery[i]) {
                    ^^^^^^^
当我发布这个答案时,OP已经编辑了这个问题,并纠正了我在他的代码中指出的
第二个问题。

另外,

当用户输入并按下<代码>输入< /代码>键时,<代码> FGETSH()/代码>将换行符视为一个有效字符,并将其包含在用户给出的输入字符串中。在处理输入缓冲区

arr
之前,请删除尾随的换行符,如下所示:

arr[strcspn(arr, "\n")] = 0;

你给我们的代码有很多问题。我不知道从哪里开始,但我将跳过所有的解释,这是您的工作代码,但我不喜欢使用您的输入和内存管理风格:P

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

#pragma warning(disable : 4996)

void code(const char** litery[], const char** mors) {
    char arr[256];
    printf("string to be coded:\n");
    fgets(arr, 256, stdin);
    for (int counter = 0; counter < strlen(arr); ++counter) {
        if (arr[counter] == ' ') {
            printf(" ");
        }
        int i;
        for (i = 0; i < 36; ++i) {
            if (arr[counter] == litery[i]) {                    
                printf("%s", (mors[i]));
                break;
            }
        }
    }

}

int main() {
    const char* litery[] = { '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', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
    const char* mors[] = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "-----" };
    code(&litery, &mors);
}
#包括
#包括
#包括
#杂注警告(禁用:4996)
无效代码(常量字符**litery[],常量字符**mors){
char-arr[256];
printf(“要编码的字符串:\n”);
fgets(arr,256,标准DIN);
对于(int计数器=0;计数器
是的,你完全正确,谢谢你的帮助!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma warning(disable : 4996)

void code(const char** litery[], const char** mors) {
    char arr[256];
    printf("string to be coded:\n");
    fgets(arr, 256, stdin);
    for (int counter = 0; counter < strlen(arr); ++counter) {
        if (arr[counter] == ' ') {
            printf(" ");
        }
        int i;
        for (i = 0; i < 36; ++i) {
            if (arr[counter] == litery[i]) {                    
                printf("%s", (mors[i]));
                break;
            }
        }
    }

}

int main() {
    const char* litery[] = { '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', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
    const char* mors[] = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "-----" };
    code(&litery, &mors);
}