Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用空格在字符串上迭代_C_Arrays_String_Cryptography - Fatal编程技术网

C 用空格在字符串上迭代

C 用空格在字符串上迭代,c,arrays,string,cryptography,C,Arrays,String,Cryptography,我目前正在编写一个小的旋转程序。但我对“这是一个测试”这样的字符串有困难。当我有这样一个字符串时,它只编码前4个字符,而不是整个字符串。。似乎空白区正在分解一些东西。我试图用if语句忽略空格,但这不起作用,我不知道为什么。你对这个问题有什么想法吗 是的。。。该代码是非常实验性的,所以请不要对常量数组大小之类的东西感到愤怒 #include <stdio.h> #include <stdlib.h> #define alphabetsize 26 char alphabe

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

是的。。。该代码是非常实验性的,所以请不要对常量数组大小之类的东西感到愤怒

#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