使用scanf(),gets()或fgets()函数?

时间:2014-06-26 18:21:43

标签: c string scanf fgets spaces

我正在尝试通过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);
}

3 个答案:

答案 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()`