为什么只打印这些字符串中的最后一个字母?

时间:2014-03-02 22:43:34

标签: c++ arrays string arduino

我很想知道Arduino Leonardo的键盘和鼠标库是否可能被用作Windows用户密码暴力黑客。使用我有限的爱好编码和arduino技能,我开始为此编写程序。

最初的问题似乎是串口输出喷出随机字母/数字时应该喷出普通密码。我花了一分钟才意识到这些是常见的密码。好吧,他们每个人的最后一封信。

守则:

// tests most common paswords, if one of these works your idiot alert should be ringing
char myStrings[26]={ 'password', '123456', '12345678',
'1234', 'qwerty','12345','password', 'dragon', 'pussy',
'baseball', 'football','monkey', 'letmein', '696969',
'abc123', 'mustang','michael', 'shadow', 'master',
'jennifer', 'harley','1234567', 'jordan',
'2000', '111111',
'COMMON PASSWORDS EXHAUSTED: ATTEMPTING BRUTE FORCE'};


//the letters... yep
char myLetters[26]={'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'};


//establishes serial connection
void setup(){
Serial.begin(9600);
}


void loop(){
for (int i = 0; i < 27; i++){
   Serial.println(myStrings[i]);
   }

   Serial.println("Common Finish"); // the common passwords have been attempted

   for (int o = 0; o < 26; o++){
   Serial.println(myLetters[o]);
   delay(500);
   }
   Serial.println("Letter Finish"); // the letters have been finished

   Serial.println("rinse wash repeat."); //the loop n' stuff

}

arduino串口监视器的图片:

Image of arduino serial monitor

我很欣赏有关我如何滥用数组或字符串的任何见解。感谢。

2 个答案:

答案 0 :(得分:1)

'...'适用于单个字符。字符串使用"..."

随后你的变量声明是错误的,因为它是一个字符数组。

但是you're doing it wrong in the first place

答案 1 :(得分:1)

char仅代表一个字符,因此myStrings实际上只是一个包含26个字母/数字的数组。每个字符串中的其他所有内容都被忽略。同样重要的是要注意,使用单引号时,每次只能有一个字符;例如'a'没问题,但'abc'无效。

要使用字符串文字(在草图运行时永远不必更改的文本),您可以使用const char *数据类型而不仅仅是char,并将文本用双引号括起来, "like this"

您可以重新编写字符串数组,如下所示:

const char *myStrings[26] = {"password", "123456", "12345678",
    "1234", "qwerty","12345","password", "dragon", "pussy",
    "baseball", "football","monkey", "letmein", "696969",
    "abc123", "mustang","michael", "shadow", "master",
    "jennifer", "harley","1234567", "jordan",
    "2000", "111111",
    "COMMON PASSWORDS EXHAUSTED: ATTEMPTING BRUTE FORCE"};

该数组中的每个字符串本身都是char的数组。您可以在Arduino网站的string documentation上阅读更多相关信息。

<强>用法
如果您只想将这些字符串输出到串行,那么您仍然可以以相同的方式访问它。例如,此循环应该仍然有效:

for (int i = 0; i < 27; i++){
    Serial.println(myStrings[i]);
}

但是,如果要比较该类型的两个字符串,则不能使用通常的相等运算符(==)。您需要使用strcmp()

字符串对象
另一种方法是使用String对象来存储字符串。它使用起来容易得多,它允许您在运行时修改字符串数据。但是,它占用了更多内存(在Arduino上非常有限)。如果你想探索那条大道,你可以在Arduino网站上查看String object documentation