Учитывая данные, которые появились в различных комментариях и ответах, я считаю, что могу предложить достаточно тщательную диагностику проблемы.
Поскольку dataTest является char [50]
(и, таким образом, в char*
), то утверждение if(dataTest == 1)
спрашивает, если точный адрес памяти, который указывает на dataTest равен 1. Тот факт, что это иногда кажется, работает это случайно. Предлагаемое исправление от аскетиста об изменении его на if(dataTest >= 0)
говорит. На большинство архитектуры, указатели всегда> = 0, причем 0 эквивалентно NULL
. Таким образом, исправление OP эффективно удаляет оператор if и связанный с ним else.
Таким образом, решение становится
int stp;
do {
printf("\nPlease enter the packet data (maximum of 50 numbers): ");
while(getchar()!='\n');
scanf("%s", dataTest);
if(dataTest == '\n')
scanf("%s", dataTest);
length = strlen(dataTest);
if(length < 50) {
for(i=0;i<=length && stp!=1;i++) {
if ((dataTest[i] >= '0' && dataTest[i] <= '9') || (dataTest[i] == 0)) {
valid=1;
win_linux();
} else {
printf("\nData must contain only numbers, '%c' is not a number. Please try again. \n", dataTest[i]);
stp=1;
valid=0;
}
}
} else {
valid = 0;
while(getchar()!='\n');
printf("\nData should have no more than 50 numbers, you have entered %i",length);
}
} while(valid!=1);
Однако, следует отметить, что это сравнение указателя также аннулирует несколько других линий, таких как if(dataTest == '\n')
, которая проверяет, если адрес dataTest
указывает, случается, в точности равна к числовому значению символа новой строки (почти наверняка false). Таким образом, эта строка также может быть удалена.
Есть также несколько тонких ошибок. Например, scanf переполняет dataTest и повреждает память, если введено 50 или более символов.
Остальная часть кода искателя действительна C I/O, хотя и немного нечиста. Указанные изменения должны заставить его работать должным образом, но я бы предложил его очистить. Я предлагаю следующую C-программу, которая должна более или менее делать то, что хочет OP.
#include <stdio.h>
#include <strings.h>
int main(void) {
// Needs to be size 51 to allow for 50 chars
char dataTest[51];
int valid = 0;
do {
while(getchar()!='\n'); // Flush stdin
printf("Please enter the packet data (max of 50 numbers): ");
// Scanf returns the number of arguments filled
// %50s says we want to read UP TO 50 chars before we hit whitespace
int successful = scanf("%50s", dataTest);
if(!successful) {
valid = 0;
continue; // If we didn't read right, try again
}
int length = strlen(dataTest);
if(length == 0) {
valid = 0;
continue; // If we only had whitespace, assume invalid
}
int i;
for(i = 0; i < length; i++) {
if(dataTest[i] >= '0' && dataTest[i] <= '9') {
valid = 1;
win_linux(); // this was in the original code by the OP
} else {
valid = 0;
break; // Takes the place of the stp variable
}
}
} while(!valid);
printf("%s\n", dataTest);
}
Какой тип dataTest? Сначала вы пытаетесь сохранить в нем строку (подразумевая char *), тогда вы пытаетесь сравнить ее с символом (подразумевая char, который разбивает scanf), затем вы пытаетесь сравнить его с 1, что является int. – LinearZoetrope
dataTest - символ. Условие «if (dataTest == 1)», как предполагается, является тестированием, - все данные являются числовыми. любые идеи, как я мог это сделать в инструкции if? – Charlieabee
Подождите, я читал ваши другие комментарии. Вы уверены, что dataType имеет тип char, а не char *? – LinearZoetrope