“scanf”函数中的程序崩溃。为什么? #包括 #包括 int main(int argc,字符**argv) { 字符键,向量; 字符纯文本[101]; 字符密码; int i,密码值; int键长度,IVLength; scanf(“%s”,键); 扫描频率(“%s”,矢量); 返回0; }

“scanf”函数中的程序崩溃。为什么? #包括 #包括 int main(int argc,字符**argv) { 字符键,向量; 字符纯文本[101]; 字符密码; int i,密码值; int键长度,IVLength; scanf(“%s”,键); 扫描频率(“%s”,矢量); 返回0; },c,scanf,C,Scanf,输入scanf部件的值后,我的程序崩溃。我不明白为什么。我的问题 #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { char key, vector; char plainText[101]; char cipher; int i, cipherValue; int keyLength, IVLength; scanf("%

输入
scanf
部件的值后,我的程序崩溃。我不明白为什么。

我的问题

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

int main(int argc, char** argv) 
{
    char key, vector;
    char plainText[101];
    char cipher;
    int i, cipherValue;
    int keyLength, IVLength;

    scanf("%s", key);
    scanf("%s", vector);

    return 0;
}
是:

  • 键和
    向量属于
    char
    类型,而不是指向
    char
    的指针。只能容纳一个字符。1
  • 使用
    %s
    scanf
    时,需要指向
    char
    的指针。就目前的情况而言,你 正在传递未初始化的整数值,就好像它是指针一样 未定义的行为,您的程序因此崩溃。编译程序 一定给了你一个警告,不要忽略编译器的警告, 他们是来帮助你的,不是来烦你的
  • 正确版本:

    scanf("%s", key);
    scanf("%s", vector);
    
    有关scanf的更多信息,请阅读


    脚注

    C中的字符串是以
    “\0”
    -终止字节。只有一个字符的字符串需要一个
    char
    数组 尺寸为2或2以上。通常,维度
    n
    char
    数组可以存储 最大长度为
    n-1
    的字符串。当你经过时,你必须记住这一点 当函数需要字符串时,指向
    char
    的指针指向函数。指向单个
    char
    会导致未定义的行为,因为它会溢出。

    编译器警告:启用它们(这里,
    gcc
    clang
    -Wformat
    )并注意它们。可能的重复-它不是完全重复,但原因是相似的,阅读解决方案就足够了。@viraptor:这些甚至不是指针@我理解戴维谢林——这就是为什么我说它不是一个完全相同的复制品。这里的答案比我们在这里写的任何东西都要好。(除非你想从头开始解释指针/值的差异:))我不确定我是否理解你的意思@daviserring
    %100s
    在这里可能更正确:)@viraptor是的,没错,我在回答中补充了这一点。
    char key[101], vector[101];
    ...
    scanf("%s", key);
    scanf("%s", vector);
    
    // or to limit the number of bytes
    // written in the buffer, as pointed out
    // in the comments by user viraptor
    scanf("%100s", key);
    scanf("%100s", vector);