Ich schrieb ein Programm in C, das als Eingabe einen Wert und ein geordnetes Array von ganzen Zahlen nimmt und eine ternäre Suche durchführt, um den Wert (wenn es existiert) innerhalb des Arrays zu finden.Doppelte Verwendung von scanf() hängt von Aufrufreihenfolge ab
Ich habe alle möglichen Probleme mit der Verwendung von scanf und den verwandten Themen hier in Stackoverflow gesehen.
Ich habe festgestellt, dass es einen Unterschied gibt, wenn ich die 2 scanf Funktionen in umgekehrter Reihenfolge aufrufen.
Wenn ich den Code verwenden, wie es unten ist. Lesen Sie zuerst den Wert und nach dem Array vom Benutzer funktioniert das Programm und scanf wie erwartet.
printf("Enter the value to be searched in the Array: ");
int k;
scanf(" %d", &k);
printf("Type elements of A(sorted) separated by spaces (type 'end' to stop): ");
i = 0;
while(scanf("%d", &A[i]) == 1) {
i++;
}//while
Obwohl, wenn ich die scanf Eingänge in umgekehrter Reihenfolge verwenden die zweite Scanf hört nie auf Benutzereingaben zu erhalten und Werte links in den Puffer eingelesen.
Ich kann nicht verstehen, was ist der Unterschied in der Reihenfolge aufrufen. Ich habe die in den anderen Threads genannten Lösungen ausprobiert, aber keine funktionierte.
nur als Referenz hier ist der gesamte Code (wie erwartet):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int ternarySearch(int A[], int l, int r, int k){
int i;
int first,second;
if(l>r){
return -1;
}
i= (r - l)/3;
if(i==0){
i++;
}
first = i+l-1;
second = i*2+l-1;
if(A[first]==k){
return first;
}
else if(A[first]>k){
ternarySearch(A, l, first-1, k);
}
else
{
if(A[second]==k)
return second;
else
if(A[second]>k)
ternarySearch(A, first+1,second-1, k);
else
ternarySearch(A, second+1,r, k);
}
}
int main(){
const int maxarraylen = 1000;
int i;
int n;
int A[maxarraylen];
char string[250];
printf("Enter the value to be searched in the Array: ");
int k;
scanf(" %d", &k);
printf("Type elements of A(sorted) separated by spaces (type 'end' to stop): ");
i = 0;
while(scanf("%d", &A[i]) == 1) {
i++;
}//while
n=i-1;
//We assume the array is sorted otherwise we can use any sorting algorithm e.g. code from task1
scanf(" %d", &k);
int result;
result=ternarySearch(A, 0, n, k);
if(result==-1){
printf("The value was not found in the Array.\n");
}
else{
printf("The value was found in position no. %d.\n", result);
}
return 0;
}
Sie sollten Ihren Code einrücken und die Verwendung von anständigen Variablennamen machen Verständnis zu unterstützen. – Attie
Vollständiger Code wird nur als Referenz verwendet, wenn jemand das Programm ausführen möchte. Die einzigen zwei wichtigen Zeilen, die für die Frage relevant sind, sind "scanf" ("% d", &k); 'und" scanf "("% d ", & A [i]) == 1 '. Eine liest nur eine Integer-Variable und die andere liest mehrere Indeger von der Kommandozeile –
So scanf entfernt die Wagenrücklauf '\ r' und/oder neue Zeile Zeichen '\ n'? Ist das der eine Weg funktioniert aber der andere nicht? Können Sie bitte erklären, wie **% * s ** funktioniert? –