我正在尝试通过Caesar加密来加密字符串,但它只适用于一个单词(字符之间没有空格)。我想加密整个句子。我在这里读过关于通过gets()
或fgets()
将键盘中的空格变成字符串的问题,但我无法使其正常运行。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv) {
printf("Enter the shift: ");
int shift,index,length;
scanf("%d", &shift);
printf("Enter the string to encrypt: " );
char string[1000];
//gets(string);
scanf("%s",string);
//fgets(string,1000,stdin);
char encrypted[strlen(string) + 1];
for(index = 0, length = strlen(string); index < length; index++ ){
if (string[index]!=' ')
encrypted[index] = 'A' + (string[index] -'A' + shift) % 26;
else
encrypted[index]=' ';
}
encrypted[ strlen(string)] = '\0';
printf("%s\n", encrypted);
return (EXIT_SUCCESS);
}
答案 0 :(得分:1)
在
char string[1000];
scanf("%s",string);
扫描终止于空格。
要获取整个字符串(不包括尾随换行符),请使用:
char string[1000], *p;
fgets(string, sizeof(string), stdin);
if ((p = strchr(string, '\n')) != NULL) {
*p = '\0'; /* remove newline */
}
正如@chux指出的那样,您需要在\n
中使用scanf
,我建议:
int shift, index, length;
char string[1000], *p;
fgets(string, sizeof(string), stdin);
shift = atoi(string);
printf("Enter the string to encrypt: " );
fgets(string, sizeof(string), stdin);
if ((p = strchr(string, '\n')) != NULL) {
*p = '\0'; /* remove newline */
}
你得到:
Enter the shift: 1
Enter the string to encrypt: MY NAME
NZ OBNF
答案 1 :(得分:0)
您正在使用scanf("%s",string);
。它一击就会停止
空白。相反,使用
fgets(string, sizeof(string), stdin);
(请注意,分配大字符串并不是一个好主意
像char string[1000];
之类的东西 - 在大多数实现中,它都是
在堆栈上。 malloc
更好。)
答案 2 :(得分:0)
其余的换行符未在scanf("%d", &shift)
部分消耗。
所以,看起来fgets并让你进入一个新的行,直到不起作用。(因为它们被给予一个新行)
while(getchar()!='\n');//get rid of the newline up
scanf("%999[^\n]", string);//It corresponds to the `gets()`