2015-11-02 3 views
1

Я хочу сделать простую кодировку, просто удалите последние данные массива, когда я вход Y.Удалить последний массив данных на C

У меня есть следующий код:

void deletedata(){ 
//system("cls"); 
char input; 
char nama[50][50]; 
char nim[50][50]; 
float ip[50]; 
printnama(); 

do{ 
printf("Wanna delete the last data for sure [Y\N] : "); 
scanf("%c",&input);fflush(stdin); 
}while(input!='Y' || input!='N'); 
    if(input=='Y'){ 
     nama[count]={" "}; 
     nim[count]={" "}; 
     ip[count]={" "}; 
     printf("Delete Success"); 
    }else if(input=='N'){ 
     printf("Ok"); 
    } 
} 

в моем VS2010 Экспресс, он говорит, что nama [count] должно быть изменчивым значением. Что мне делать?

Сначала вводю имя, номер и номер. Затем в menu3 я хочу удалить последние nama, nim и ip, которые я только что ввел.

Это глобальная переменная, которую я сделал

int count=0; 
char nama[50][50]; 
char nim[50][50]; 
float ip[50]; 
+1

'while (input! = 'Y' || input! = 'N');' должно быть 'input! = 'Y' && input! = 'N'' иначе, как только вы вводите допустимый ввод (например, 'N') цикл с остановкой, потому что' 'N '! =' Y'' вернет' true', и поскольку это 'OR', цикл снова запустится. – Arc676

+0

Уже попробуйте «\ 0», но все равно не могу. –

+1

Должно ли это 'while (input! = 'Y' || input! = 'N');' be 'while (input! = 'Y' && input! = 'N');'? – alk

ответ

1

Что вы делаете здесь:

nama[count]={" "}; 
    nim[count]={" "}; 
    ip[count]={" "}; 

Не действительный код C, потому что вы не можете явно присвоить массив в голец. В C вы не можете удалить из массива в том смысле, что он не будет существовать в памяти, но вы можете назначить nul-терминатор для предотвращения дальнейшего чтения кода после достижения последнего элемента.

Также вы никогда не инициализируете count, который вы можете заменить функцией strlen и вычесть один из них, чтобы получить последний индекс в вашем массиве. Так что попробуйте:

nama[strlen(name)-1][strlen(name[0])-1][0]='\0'; 
    nim[strlen(nim)-1][strlen(nim[0])-1][0]='\0'; 
    for(int i = 0; i < sizeof(ip)/sizeof(ip[0]), ip[i] != 0.0f; i++); // count the elements until you reach a value of 0.0f (this won't work if you have any values with 0.0f in your array) 
    if(i>=sizeof(ip)/sizeof(ip[0]) i--; 
    ip[i]=0.0f; 

Предполагая внешнюю большую размерность для nama и nim такие же, и внутреннюю большую размерность (единственный один) для ip такой же длины, вы можете просто установить счетчик на strlen(name[strlen(name)-1])-1, а затем сделать:

count = strlen(name[strlen(name)-1])-1; 
    nama[strlen(name)-1][count]='\0'; 
    nim[strlen(nim)-1][count]='\0'; 
    if(ip[0]!=0.0f) ip[count]=0.0f; 

вы также можете упростить, добавив еще одну переменную inner_count, потому что вы не хотите назвать более strlen(name)-1, чем один раз. Таким образом, в предположении, что name и nim всегда будут иметь одинаковую длину как в внутреннем, так и в внешнем измерениях, а ip будет иметь ту же длину, что и внешний размер, вы можете это сделать.

inner_count = strlen(name)-1; 
    count = strlen(name[inner_count])-1; 
    nama[inner_count][count]='\0'; 
    nim[inner_count][count]='\0'; 
    if(inner_count==50) ip[count]=0.0f; // this assumes all arrays have length of 50. 

Кроме того, что вы должны понять, что вы не можете назначить NUL терминатор к вашему ip массива и не может использовать sizeof для определения длины. Вы можете предположить, что она равна той же длине, что и массив других в вашем случае, или получить длину путем подсчета до тех пор, пока вы не достигнете значения, равного 0.0f;

+0

не работает. с '\ 0' –

+0

@SamuelArnoSaputra См. мой обновленный ответ. – Linus

Смежные вопросы