建议和反馈

请填写你的反馈内容

问答 > 密码学 > 问答详情
求助中

用空格迭代字符串10LK

我目前正在编写一个小旋转程序。 但我对“这是一个测试”这样的字符串有困难。 当我有这样一个字符串时,它只编码前4个字符而不是整个字符串..似乎空格正在破坏某些东西。 我试图用if语句忽略空格,但这不起作用,我不知道为什么。 你对这个问题有什么想法吗?

是的...代码是非常实验性的,所以请不要愤怒的const数组大小和这样的东西..

#include <stdio.h>
#include <stdlib.h>
#define alphabetsize 26

char alphabet[alphabetsize] = {'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'};
char lookup[alphabetsize] = {'0'};

char target[100] = {' '};

int search(char ch){
  int i = 0;
  for( ; i < alphabetsize; i++){
    if(alphabet[i] == ch) return i;
  }
}

char* rotate(char string[], int rotn){
  int i = 0;
  for( ; i < alphabetsize ; i++){
    lookup[rotn] = alphabet[i];
    rotn++;
    if(rotn == (alphabetsize)) rotn = 0;
  }
  i = 0;
  int index = 0;
  for( ; i < 100; i++){
    printf("%d\n", i );
    if(string[i] != ' '){
      index = search(string[i]);
      target[i] = lookup[index];
    }
  }
  printf("%s\n", target);
  return target;

}

int main(int argc, char *argv[]){
  int rotn = strtol(argv[2], NULL, 10);
  printf("String: %s\n", argv[1]);
  printf("Used Rotation degree: %d\n", rotn);
  char* string = rotate(argv[1], rotn);
  printf("Decrypted/Encrypted String: %s\n", string);

  return 0;
}


2019-07-20
0
请先登陆或注册

smallfish2019-07-20

部分问题出在search ,如果在alphabet找不到ch则无法返回值。 实际上,这意味着它将返回一个未知值,然后您可以使用该值而无需任何检查来索引lookup数组。

根据内存的随机内容,您可能会在target数组中注入空格或NUL字符。

这实际上是由你的rotate函数触发的,它不会检查输入字符串中是否存在NUL ,并且不会在字符串的末尾终止。

考试

   if(string[i] != ' ')

允许使用输入字符串中不可避免的NUL调用search 。 然后用随机值继续调用搜索八十次左右 - 其中大多数不太可能在'a'...'z'

只要您使用小写字符以外的其他内容调用search ,您的程序就会进入未定义行为的世界。

最后,正如@gaemaf所提到的,循环中的输出索引需要独立于输入索引i 。 当您在输入中跳过空格时,也会提前输出指针(因为您使用i作为两者)。

初始化target[100] = {' '}仅初始化数组的第一个位置。 其余包含二进制零,其中printfmain作为字符串的结尾。 因此,即使您旋转整个字符串,也只会打印出第一个字左右。

要进行测试,请使用输入字符串“a bc def”进行测试。 我怀疑你只会打印出一个字符。


投一票
评论(0)
赞赏(0)
邀请

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励