C 用空格在字符串上迭代
我目前正在编写一个小的旋转程序。但我对“这是一个测试”这样的字符串有困难。当我有这样一个字符串时,它只编码前4个字符,而不是整个字符串。。似乎空白区正在分解一些东西。我试图用if语句忽略空格,但这不起作用,我不知道为什么。你对这个问题有什么想法吗 是的。。。该代码是非常实验性的,所以请不要对常量数组大小之类的东西感到愤怒C 用空格在字符串上迭代,c,arrays,string,cryptography,C,Arrays,String,Cryptography,我目前正在编写一个小的旋转程序。但我对“这是一个测试”这样的字符串有困难。当我有这样一个字符串时,它只编码前4个字符,而不是整个字符串。。似乎空白区正在分解一些东西。我试图用if语句忽略空格,但这不起作用,我不知道为什么。你对这个问题有什么想法吗 是的。。。该代码是非常实验性的,所以请不要对常量数组大小之类的东西感到愤怒 #include <stdio.h> #include <stdlib.h> #define alphabetsize 26 char alphabe
#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;
}
#包括
#包括
#定义字母表26
字符字母[Alphabetize]={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’};
字符查找[Alphabetize]={'0'};
字符目标[100]={''};
int搜索(char-ch){
int i=0;
对于(;i
这并不能解决您的代码问题,这是一个代码示例,由于其模糊性,可能无法给您带来好成绩,但您必须认识到,如果您了解ASCII字符集的布局,使用模块化数学很容易解决“rotN”类型的问题
#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;
}
#包括
#包括
#包括
字符*旋转(字符*s,整数旋转)
{
char*s1=s;
对于(;*s!='\0';s++)if(isalpha(*s))
*s=(((*s>'Z')?'a':'a')+(((*s-((*s>'Z')?'a':'a'))+rotn)%26);
返回s1;
}
int main(int argc,char*argv[])
{
int rotn=strtol(argv[2],NULL,10);
printf(“字符串:%s\n”,argv[1]);
printf(“使用的旋转度:%d\n”,rotn);
char*string=rotate(argv[1],rotn);
printf(“解密/加密字符串:%s\n”,字符串);
返回0;
}
这并不能解决您的代码问题,这是一个代码示例,由于其模糊性,可能无法给您带来好成绩,但您必须认识到,如果您了解ASCII字符集的布局,使用模块化数学很容易解决“rotN”类型的问题
#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;
}
#包括
#包括
#包括
字符*旋转(字符*s,整数旋转)
{
char*s1=s;
对于(;*s!='\0';s++)if(isalpha(*s))
*s=(((*s>'Z')?'a':'a')+(((*s-((*s>'Z')?'a':'a'))+rotn)%26);
返回s1;
}
int main(int argc,char*argv[])
{
int rotn=strtol(argv[2],NULL,10);
printf(“字符串:%s\n”,argv[1]);
printf(“使用的旋转度:%d\n”,rotn);
char*string=rotate(argv[1],rotn);
printf(“解密/加密字符串:%s\n”,字符串);
返回0;
}
问题的一部分在于搜索
,如果在字母表
中找不到ch
,搜索将无法返回值。实际上,这意味着它将返回一个未知值,然后您可以不进行任何检查就使用该值来索引查找
数组
根据内存的随机内容,可以将空格或NUL
字符注入target
数组
这实际上是由rotate
函数触发的,该函数不检查输入字符串中是否存在NUL
,也不在字符串末尾终止
测试
if(string[i] != ' ')
允许使用输入字符串中的不可避免的NUL
调用search
。然后,您继续使用随机值调用search大约80次,其中大部分不太可能位于'a'…'z'
只要您使用小写字符以外的其他字符调用search
,您的程序就进入了未定义行为的世界
fnily,正如@gaemaf所提到的,循环中的输出索引需要独立于输入索引i
。当您跳过输入中的空白时,您还可以前进输出指针(因为您同时使用i
)
初始化目标[100]={'}
仅初始化数组的第一个位置。其余的包含二进制零,它是main
中的printf
作为字符串结尾的interpets。因此,即使旋转整个字符串,也只会打印出第一个左右的单词
要进行测试,请使用输入字符串“abc def”进行尝试。我怀疑您只会打印出一个字符。您的部分问题在于
搜索
,如果在字母表
中找不到ch
,则搜索无法返回值。实际上,这意味着它将返回一个未知值,然后您可以不进行任何检查就使用该值来索引查找
数组
根据内存的随机内容,可以将空格或NUL
字符注入target
数组
这实际上是由rotate
函数触发的,该函数不检查输入字符串中是否存在NUL
,也不在字符串末尾终止
测试
if(string[i] != ' ')
允许使用输入字符串中的不可避免的NUL
调用search
。然后,您继续使用随机值调用search大约80次,其中大部分不太可能位于'a'…'z'
只要您使用小写字符以外的其他字符调用search
,您的程序就进入了未定义行为的世界
最后,正如@gaemaf所提到的,您在l