提问人:BigD 提问时间:8/9/2023 更新时间:8/9/2023 访问量:26
C 用户输入零星无效结果
C user input sporadic invalid results
问:
用 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 编程的新手。提前致谢。
答:
1赞
Some programmer dude
8/9/2023
#1
问题很可能出在以下陈述上:
strcpy(data, string_input);
在这里,您将数据复制到一个只能包含六个字符的数组中,包括 null-terminator。
当你创建和初始化数组时,你只为字符串腾出空间,仅此而已。data
"Dummy"
如果输入的长度超过 5 个字符,则意味着您将超出 的范围,并具有未定义的行为。data
为数组设置一个特定大小,该大小足以容纳最大的输入。data
或者继续使用 ,根本不使用。string_input
data
评论
0赞
BigD
8/9/2023
谢谢,我以为 strlcpy 会解决这个问题,不知道我从哪里得到这个概念。.另外,我确实按照一些程序员的建议删除了 malloc。谢谢!我真的很感激。
评论
getline
将为您完成。此外,您不应该强制转换malloc
的结果。string_input