C 用户输入零星无效结果

C user input sporadic invalid results

提问人:BigD 提问时间:8/9/2023 更新时间:8/9/2023 访问量:26

问:

用 C 编码,我在用户输入方面遇到了问题。有时,输入有效,有时无效。

终端的运行输出示例:

dennis@MBP2021 Encryption % make
cc Gronsfeld_Cipher.c /Users/dennis/Documents/C/programs/DJSlibrary/cs50.c -o cipher
dennis@MBP2021 Encryption % ./cipher 

Please enter line to be encoded: This, however, is not the time.

You entered: This, however, is not the time. Length: 31

The message is:  This, however, is not the time.
The cipher is:   EZNH, SCVKOHZ, KF UFP GXF ONWX.
The decipher is: THIS, HOWEVER, IS NOT THE TIME.


dennis@MBP2021 Encryption % ./cipher

Please enter line to be encoded: This, however, is not the time, nor the place to have fun.

You entered: This, however, is not the time, nor the place to have fun. Length: 58
zsh: trace trap  ./cipher
dennis@MBP2021 Encryption % 

代码片段:

char data[] = "Dummy";
int keys[] = {11, 7, 13, 10, 25, 9, 8, 3};  


// Do the stuff
int main(void)
{   
    // Get input from user
    char *string_input = NULL;
    size_t string_size = 250;
    ssize_t bytes_read;

    printf("\nPlease enter line to be encoded: ");
    string_input = (char *) malloc(string_size);
    bytes_read = getline(&string_input, &string_size, stdin);

    if(bytes_read < 2)
    {
        printf("\n\nNo input was entered. Program terminating.\n");
        printf("Error Code: 1\n\n");
        free(string_input);
        return 1; 
    }

    string_input[bytes_read-1] = 0; // Clear out the new line.
    
    printf("\nYou entered: %s Length: %ld\n", string_input, bytes_read-1);
    strcpy(data, string_input);
    free(string_input);

    // Get sizes
    int DataLen = strlen(data);
    int ks = sizeof(keys) / sizeof(keys[0]);

    printf("\nThe message is:  %s", data);

根据我在终端上看到的内容,它在 strcpy 处死亡(我猜) 行 string_input[bytes_read-1] = 0; // 清除新行 试图删除字符串输入末尾的换行符。它永远不会到达最后一个 printf。我不明白为什么它使用小行(31 字节)而不是 58 字节行。我尝试在 vscode 中使用调试,但它不允许我输入输入行。我还需要找出其他东西。另外,我是 C 编程的新手。提前致谢。

C 字符串 输入 无效字符

评论

0赞 Some programmer dude 8/9/2023
不相关,但无需显式分配内存,getline 将为您完成。此外,您不应该强制转换 malloc 的结果string_input

答:

1赞 Some programmer dude 8/9/2023 #1

问题很可能出在以下陈述上:

strcpy(data, string_input);

在这里,您将数据复制到一个只能包含六个字符的数组中,包括 null-terminator。

当你创建和初始化数组时,你只为字符串腾出空间,仅此而已。data"Dummy"

如果输入的长度超过 5 个字符,则意味着您将超出 的范围,并具有未定义的行为data

为数组设置一个特定大小,该大小足以容纳最大的输入。data

或者继续使用 ,根本不使用。string_inputdata

评论

0赞 BigD 8/9/2023
谢谢,我以为 strlcpy 会解决这个问题,不知道我从哪里得到这个概念。.另外,我确实按照一些程序员的建议删除了 malloc。谢谢!我真的很感激。