Hjälp med (Objective-) C (scanf som inte registreras)

Permalänk
Medlem

Hjälp med (Objective-) C (scanf som inte registreras)

Hej alla programmerare här på SweClockers, jag har nyligen börjat lära mig Objective-C, som liknar C väldigt mycket, och har nu stött på ett problem med scanf. Koden jag bifogar här är den kod jag har, och programmet är inte slutgiltigt, och jag lär troligtvis i framtiden byta ut vissa delar mot klasser och funktioner, men orkade inte med det just nu. I alla fall, mitt problem är alltså att jag har ett antal scanf i min kod för user input, men problemet är att bara den första registreras i koden, och koden går sedan förbi alla if-statements, och hoppar direkt till else (vilket är då den inputen inte är y eller n). Det här är extremt jobbigt när man som nybörjare tycker att koden ser rätt ut, men det blir fel. Koden bifogas nedan, med kommentarer.

// // main.m // calculator refined // // Created by Leo Sjöberg on 1/15/12. // Copyright (c) 2012 __MyCompanyName__. All rights reserved. // #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; char answer; //confirmation by user char operator; int inputFirst; int inputSecond; int result; NSLog(@Insert your equation (valid operators are +, -, *, /):); scanf("%i %c %i", &inputFirst, &operator, &inputSecond); NSLog(@Are you sure that you want to compute %i %c %i?, inputFirst, operator, inputSecond); scanf("%c", &answer); //scanf is not registered? if (answer == 'y') { if (operator == '+') { result = inputFirst + inputSecond; NSLog(@%i %c %i = %i, inputFirst, operator, inputSecond, answer); } if (operator == '-') { result = inputFirst - inputSecond; NSLog(@%i %c %i = %i, inputFirst, operator, inputSecond, answer); } if (operator == '*') { result = inputFirst * inputSecond; NSLog(@%i %c %i = %i, inputFirst, operator, inputSecond, answer); } if (operator == '/') { result = inputFirst / inputSecond; NSLog(@%i %c %i = %i, inputFirst, operator, inputSecond, result); } } if (answer == 'n') { while (answer == 'n') { NSLog(@Insert your equation (valid operators are +, -, *, /):); scanf("%i %c %i", &inputFirst, &operator, &inputSecond); NSLog(@Are you sure that you want to compute %i %c %i?, inputFirst, operator, inputSecond); scanf("%c", &answer); } } else NSLog(@That is not a valid answer, program will terminate.); return 0; [pool drain]; }

Problemet är som ni ser vid kommentaren på min andra scanf att den inte tar någon user input utan direkt svarar som om att den fick ett svar som inte var y eller n. Någon som vet varför? Om ni har några frågor eller om ni tycker att jag är otydlig får ni gärna säga till så försöker jag förklara bättre

Tack på förhand

Phroggyy

EDIT: kan man dessutom strunta i min if (answer == 'n'), och gå direkt på while-loopen?

Visa signatur

Citera för svar!|Fraktfritt hos INET|Min hemsida
Fractal Design Define R3|Corsair AX 850W|Gigabyte Nvidia GeForce GTX 570|Corsair Vengeance 1600MHz 2x4GB|ASRock P67 Extreme4|Intel Core i5 2500K|2x Samsung Spinpoint F3 1TB|Samsung Blu-Ray läsare
Nikon D7000|Nikon 60mm macro|Nikon 18-70|Nikon 55-300|Nikon 10.5 Fisheye

Permalänk
Medlem

Jag har aldrig använt Objective-C, men i "vanligt" C är detta ett vanligt misstag. Vid din andra scanf ligger '\n' (enter-tangenten) fortfarande kvar i input buffern som scanf läser ifrån. Eftersom din andra scanf bara läser en enda char, kommer den att plocka '\n' och fortsätta programexekveringen.

Kolla på http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=10448... för lite mer info om hur man kan komma runt det.

Permalänk
Medlem
Skrivet av pelleplu:

Jag har aldrig använt Objective-C, men i "vanligt" C är detta ett vanligt misstag. Vid din andra scanf ligger '\n' (enter-tangenten) fortfarande kvar i input buffern som scanf läser ifrån. Eftersom din andra scanf bara läser en enda char, kommer den att plocka '\n' och fortsätta programexekveringen.

Kolla på http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=10448... för lite mer info om hur man kan komma runt det.

Hmm, mycket möjligt att det är det där som ställer till det, tackar för länken, eftersom jag är nybörjare undrar jag nu bara en sak: var ska jag skriva vad i min kod för att det inte ska hända, uppskattar länken

EDIT: körde med

while ((c = getchar()) !='\n' && c != EOF)

som jag hittade, men det löste sig inte!

Visa signatur

Citera för svar!|Fraktfritt hos INET|Min hemsida
Fractal Design Define R3|Corsair AX 850W|Gigabyte Nvidia GeForce GTX 570|Corsair Vengeance 1600MHz 2x4GB|ASRock P67 Extreme4|Intel Core i5 2500K|2x Samsung Spinpoint F3 1TB|Samsung Blu-Ray läsare
Nikon D7000|Nikon 60mm macro|Nikon 18-70|Nikon 55-300|Nikon 10.5 Fisheye

Permalänk
Medlem

Vart satte du in kodsnutten? Tanken är att du sätter in den efter din första scanf, men innan din andra, så att den "rensar" input buffern innan den gör nästa inläsning.

Permalänk
Medlem
Skrivet av pelleplu:

Vart satte du in kodsnutten? Tanken är att du sätter in den efter din första scanf, men innan din andra, så att den "rensar" input buffern innan den gör nästa inläsning.

Mm, först satte jag den direkt innan min andra scanf, och då visade den bara NSLogen, när jag sen la den direkt efter den första scanf så kom inte frågan om man ville godkänna upp, utan den gick direkt till scanf, och hoppade över NSLogen, har du någon aning om varför?

EDIT: det löste sig, hade glömt ett continue efter att jag satt in min while! Tackar så mycket för att du nämnde buffern, hade aldrig kommit på det själv!

Visa signatur

Citera för svar!|Fraktfritt hos INET|Min hemsida
Fractal Design Define R3|Corsair AX 850W|Gigabyte Nvidia GeForce GTX 570|Corsair Vengeance 1600MHz 2x4GB|ASRock P67 Extreme4|Intel Core i5 2500K|2x Samsung Spinpoint F3 1TB|Samsung Blu-Ray läsare
Nikon D7000|Nikon 60mm macro|Nikon 18-70|Nikon 55-300|Nikon 10.5 Fisheye