c中的加密不起作用

时间:2014-08-13 08:54:23

标签: c encryption

在下面的程序中,我想加密一个句子。然而,当空间到来时它会提供不完整的输出。任何帮助都非常有用。

#include<stdio.h>
#include<string.h>
main()
{
    printf("Enter a string : ");
    char c[100];
    scanf("%s",c);
    int i;
    for(i=0;i<100;i++)
    {
        if((c[i]>='A'&&c[i]<='Z')||(c[i]>'a'&&c[i]<'z'))
        {
            c[i]+=13;
            if(!(c[i]>='A'&&c[i]<='Z')||(c[i]>'a'&&c[i]<'z'))
            c[i]-=26;
        }
    }
    printf("Encrypted string is : %s\n",c);
}

提前致谢

2 个答案:

答案 0 :(得分:5)

scanf停止在空白区域阅读,更改为fgets

fgets(c, sizeof c, stdin);

您可以使用以下方式跳过尾随换行符:

char c[100], *p;
fgets(c, sizeof c, stdin);
if ((p = strchr(c, '\n')) != NULL) { 
    *p = '\0'; /* remove newline */
}

另外,请考虑使用

if (isalpha((unsigned char)c[i]))

而不是

if((c[i]>='A'&&c[i]<='Z')||(c[i]>'a'&&c[i]<'z'))

不要忘记包含<ctype.h>

答案 1 :(得分:0)

如果您想扫描空格,则表示不要使用%s格式说明符。使用%[^\n]格式说明符,它将扫描除新行(\n)之外的所有内容。

scanf("%[^\n]",c); // Fix 1

如果您使用scanf扫描用户输入,则无需在结尾添加NULL。它会自动添加。

在循环中无需像这样检查整个数组(最多100个字符)for(i=0;i<100;i++),如果输入为4或5个字符意味着不必要的话它会检查剩余位置,这样它会给你一些垃圾值。因此,限制循环以检查用户输入 -

for(i=0;c[i];i++) or for(i=0;c[i] != '\0';i++) //Fix 2

这两个都一样。当找到空字符时,它将终止循环。

试试这段代码 -

#include<stdio.h>
#include<string.h>
int main()
{
        int i;
        char c[100];
        printf("Enter a string : ");
        scanf("%[^\n]",c);
        for(i=0;c[i];i++)
        {
               if((c[i]>='A'&&c[i]<='Z')||(c[i]>'a'&&c[i]<'z'))
               {
                    c[i]+=13; 
                    if(!(c[i]>='A'&&c[i]<='Z')||(c[i]>'a'&&c[i]<'z'))
                    c[i]-=26;
               }
        }
        printf("Encrypted string is : %s\n",c);
        return 0;
}