我目前正在编写一个小旋转程序。但我对“这是一个测试”这样的字符串有困难。当我有这样一个字符串时,它只编码前4个字符而不是整个字符串..似乎空格正在破坏某些东西。我试图用if语句忽略空格,但这不起作用,我不知道为什么。你对这个问题有任何想法吗?
是的......代码是非常实验性的,所以请不要愤怒地讨论const数组大小等问题。
Request
答案 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;
}