用空格迭代字符串

时间:2015-05-03 20:17:17

标签: c arrays string cryptography

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

是的......代码是非常实验性的,所以请不要愤怒地讨论const数组大小等问题。

Request

3 个答案:

答案 0 :(得分:3)

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

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

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

测试

   if(string[i] != ' ')

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

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

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

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

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

答案 1 :(得分:2)

我发现了你的问题,所以请试着让我知道:

旋转功能中的

更改为:

int targetIndex = 0;
for (; i < 100; i++){
    printf("%d\n", i);
    if (string[i] != ' '){
        index = search(string[i]);
        target[targetIndex++] = lookup[index];
    }
}

否则,因为您的目标初始化为NULL,您将永远不会看到完整的结果。 要解决您的问题,您需要添加另一个变量,如targetIndex。

答案 2 :(得分:0)

这不能解决您的代码问题,并且是一个代码示例,由于其混淆可能无法让您获得好成绩,但您必须意识到“rotN”类型的问题很容易通过模块化数学,如果您了解ASCII字符集的布局......

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

char* rotate(char *s, int rotn)
{
  char *s1=s;
  for(;*s!='\0'; s++) if(isalpha(*s))
    *s = ((*s>'Z')?'a':'A')+(((*s-((*s>'Z')?'a':'A'))+rotn)%26);
  return s1;
}

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;
}