为什么我的C代码会跳过下一个用户输入?

我正在尝试将我的Caesar Cipher代码转换为使用用户给定的参数来使用用户给定的输入,但它并没有按照我的预期方式进行。 我有这个代码,它询问ROT编号的第一个输入,但随后它会跳过其余代码的输入。 现在,如果我想旋转2并使用字符串bB,则输出应该是dD,并且它是,但是只有在为输入选择时,才输入“2 bB”。 我不知道为什么会这样,而且我看过其他线程说只是把scanf(“%c”,&blah);,但我不知道如何在我的情况下这样做。 任何帮助都很感激。

编辑:将char更改为int,就像我在发布之前在代码中所做的那样。

#include  #include  #include  #include  int main(){ /**********************************************************************************************************************************/ int bytesRead; int nbytes = 255; char *encryptString; encryptString = (char *) malloc (nbytes + 1); //char encryptString[256]; char finalChar; char finalString[256]; int rotNum; /**********************************************************************************************************************************/ puts("Please enter the ROT (rotate) number you wish to encrypt by: "); scanf("%d", &rotNum); printf("Please enter the phrase you'd like to encrypt: \n"); fgets(encryptString, sizeof(encryptString), stdin); printf("The string entered is: %s\n", encryptString); printf("The encrypted version is: "); int n = strlen(encryptString) - 1; int i; for(i = 0; i < n; i++){ //For loop to go through the entire string entered if(isupper(encryptString[i])){ finalChar = (((encryptString[i] - 65) + rotNum) % 26) + 65; finalString[i] = toupper(finalChar); //printf("%c\n", finalChar); } else if(islower(encryptString[i])){ finalChar = (((encryptString[i] - 97) + rotNum) % 26) + 97; finalString[i] = tolower(finalChar); //printf("%c\n", finalChar); } else{ finalChar = ' '; finalString[i] = finalChar; } printf("%c", finalString[i]); } printf("\n"); return 0; } 

您的代码中几乎没有问题:

1)

 scanf("%d", &rotNum); 

在这里,您将char *传递给scanf()。 将rotNum声明为int。

2)读取输入rotNum ,scanf()在输入缓冲区中留下’\ n’。 fgets(); \n一旦遇到\n停止读取输入 所以fgets()根本不读。 使用getchar(); 在scanf()调用之后使用换行符char。 或者更好,使用fgets()读取rotNum并使用sscanf()解析它。

3)你对fgets()的第二个参数是错误的。

 fgets(encryptString, sizeof(encryptString), stdin); 

这里, encryptString是一个指针。 因此,这将为您提供平台上指针的大小,而不是它指向的字节数(256)。 将其更改为:

 fgets(encryptString, 256, stdin); // or whatever the bytes you allocate 

Additioanlly,

1)对main() )使用正确的返回类型,例如int main(void)int main(int argc, char **argv)或等效的。
2)检查malloc()的返回值是否为NULL ,看它是否失败。
3) 转换malloc()返回是不必要的,容易出错。

我对您的代码进行了三次更改,它没有任何问题:

 1. Use "int rotNum" instead of "char rotNum" 2. Use "scanf("%s", encryptString)" instead of "fgets(encryptString, sizeof(encryptString), stdin)" 3. Either use "int n = strlen(encryptString)" or "for(i = 0; i <= n; i++)" 

您必须进行一些其他更改才能使其适用于负rotNum。

正如fgets的手册所说,

fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline.

因此,当您输入旋转数字然后按enter ,输入缓冲区将包含number\n 。 数字将存储在rotNum\n将保留在stdin 。 所以fgets会在没有等待输入的情况下读取它并返回。

使用scanf而不是fgets 。 如果您使用的是linux机器,那么这是手册页

在使用fgets之前尝试fflush(stdin) 。 这应该从stdin清除\ n