Fehler bei scanf_s

Gast #982185
Hallo zusammen

habe wie oben gesagt ein Problem mit der scanf_s. Ich möchte die CRC16 
für eine Modbuscom berechnen. Wenn ich die Werte fest vergebe ist das 
auch kein Problem. Nur wenn ich sie über scanf_s einlese, bekomme ich 
fehler in der Berechnung. Bzw ein Array wird nicht mit Daten gefüllt. 
Jemand ne Idee? Anbei der Code
1
#include <stdio.h>
2

3
// Berechnung CRC16
4
// ----------------
5
unsigned int CRC16(unsigned int crc, unsigned int data)
6
{
7
const unsigned int Poly16=0xA001;  //Generatorpolynom
8
unsigned int LSB, i;
9
crc = ((crc^data) | 0xFF00) & (crc | 0x00FF);
10
for (i=0; i<8; i++)
11
{
12
LSB=(crc & 0x0001);
13
crc=crc/2;
14
if (LSB)
15
crc=crc^Poly16;
16
}
17
return(crc);
18
}
19

20
int main()
21
{
22

23
/*unsigned*/ char NumData;  
24
/*unsigned*/ char InputByte; 
25
/*unsigned*/ char i,data[255]/*={01,43,14,01,00}*/; // Telegrammbuffer
26
unsigned char Crc_HByte,Crc_LByte; //
27
unsigned int Crc;
28

29
/*Einlesen des Wortes Problemzone*/
30
printf("Anzahl der Bytes: ");
31
scanf_s("%d",&NumData);
32
printf("Anzahl der Bytes = %d\n",NumData);
33

34
for (i=0; i<NumData;i++)
35
{
36
  printf("Wert Byte:" );
37
  scanf_s("%d",&InputByte);   
38
  data[i]= InputByte;
39
}
40
printf("Wert data: %d\n %d\n %d\n %d\n %d\n" ,data[0],data[1],data[2],data[3],data[4]);
41

42
/*keine Probleme*/
43
Crc=0xFFFF;
44
for (i=0; i<NumData; i++) 
45
{
46
Crc = CRC16 (Crc, data[i] );
47
}
48
Crc_LByte = (Crc & 0x00FF); // Low-Byte bestimmen
49
Crc_HByte = (Crc & 0xFF00) / 256; // High-Byte bestimmen
50

51
printf("LByte %d\n",Crc_LByte);
52
printf("HByte %d\n",Crc_HByte);
53
while (1)
54
{;
55
;}
56
}

Alles auf der Basis von Visual c++ 2005.
Persönliche Seite
1
/*unsigned*/ char NumData;  
2
...
3
scanf_s("%d",&NumData);

Das geht schief. "%d" instruiert scanf, einen int-Pointer zu verwenden.

sizeof int != sizeof char

Damit wird also nicht nur der Speicher beschrieben, der für "NumData" 
reserviert ist, sondern auch noch andere Dinge, die in der gleichen 
Gegend abgelegt sind, hier also potentiell noch "InputByte" und/oder 
"i".

Du solltest einen passenderen Formatspezifizierer verwenden, allein, der 
C-Standard sieht keinen für diesen Fall passenden vor.
Also musst Du in einen int einlesen und danach umkopieren.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.