ibilalkayy Ответов: 0

Как решить проблему scanf и fgets в C?


В этом коде проблема, с которой я сталкиваюсь, возникает всякий раз, когда я пытаюсь использовать функция scanf после
printf("Enter your choice: ");
в первой части и
printf("Enter your name: ");
во второй части она не позволяет мне
fputs("Select your choice to update: ", stdout);
выполните этот код далее. Он останавливается там, но всякий раз, когда я использую fgets это дает сообщение о том, что
printf("Access Denied. Please enter correct Details.\n");
Как решить эту проблему.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 15
    #define STRING_LEN 50
    
    int update_info(FILE * fr1, FILE * fr2, FILE * fr3, FILE * fw1, char *name, int *dob);
    /* Global Variables */
    char one='1', two='2', three='3', four='4', five='5', six='6', seven='7', eight='8', choice[MAX];
    static const char * listing[] = {"Name", "Date of birth","ID card number","Phone number","Address","Account","Fixing year","Deposit amount"};
    
    int main(){
    	FILE * fw1 = fopen("new.csv","w");
        FILE * fr1 = fopen("file.csv", "r");
        FILE * fr2 = fopen("file.csv", "r");
    	FILE * fr3 = fopen("file.csv","r");
    
    	int dob[11];
    	char name[15] = "";
    
    	while(one != choice[0]){
    		printf("%c. Create new account\n",one);
    		printf("%c. Update information\n",two);
    
    		printf("Enter your choice: ");
    		scanf("%7s", &choice); 
            // fgets(choice, 7, stdin);         
    
    		if (choice[0] == one){
    			printf("Selected One");
    			break;
    		}
    		else if (choice[0] == two){
    			update_info(fr1, fr2, fr3, fw1, name, dob);
    			break;
    		}
    		else{
    			printf("Please enter the correct information\n");
    			break;
    		}
      }
    	return 0;
    }
   
Next part 

    int update_info(FILE * fr1, FILE * fr2, FILE * fr3, FILE * fw1, char *name, int *dob){
    	int option, i=0, one_by_one;
    	char file_text[100], updated_name[50], str[100], string[STRING_LEN], input[STRING_LEN], saved_word[STRING_LEN];
    	char* word = NULL;
    	short int FLAG = 0;
      
    	printf("Enter your name: ");
    	scanf("%s", &str);
    	// fgets(str, 100, stdin);
    
    	while(fscanf(fr1, "%s", file_text) != EOF){
    		if(!strcmp(file_text, str)){
    			printf("Found. Here are your details. \n");
    			FLAG = 1;
    		}
    	}
    
    	if (!(FLAG == 1)){
    		printf("Access Denied. Please enter correct Details.\n");
    		return -1;
    	}
    	fclose(fr1);
    
    	int c = fgetc(fr2);
    	while(c != EOF){
    		file_text[one_by_one] = c;
    		if(file_text[one_by_one] == ','){
    			file_text[one_by_one] = '\0';
    			printf("Here is your %s: %s\n",listing[i],file_text);
    			one_by_one = 0;
    			i++;
    		}
    		else
    			one_by_one++;
    		c = fgetc(fr2);
       }
      fclose(fr2);
    
      for (option = 1; option <= sizeof(listing)/sizeof(char *); ++option)
    	  printf("%d. Your %s\n", option, listing[option-1]);  
    
      // printf("Select your choice to update: ");
    	fputs("Select your choice to update: ", stdout);
    	scanf("%d", &option);
    
    	if (option == 1){
    		while(fgets(string, STRING_LEN-1, fr3)){
    			printf("Scanned now.\n");
    		}
    	}
     	return 0;
    }

What I have tried:

You can check it and its working fine but two problems I am not understanding.

Richard MacCutchan

Почему вы пытаетесь ввести строку из 7 символов, когда все, что вам нужно, - это одно числовое значение? Сделай это так:

int выбор;
scanf ("%d", &choice);
переключатель (выбор)
{
корпус 1;
// что бы ни делал вариант 1;
перерыв;
случай 2;
// любой вариант 2does;
перерыв;
по умолчанию:
// плохая ситуация с опционами
}

KarstenK

опубликуйте его как ответ.

0 Ответов