Другие языки программирования и технологии

Массив Си. Почему если я ввожу asd то в консоль выводятся dasd?

#include <stdio.h>
#include <string.h>

main()
{
char str[255],s;
int lt,i;

scanf("%s", str);
lt = strlen(str);

printf("\nСтрока получена, размер массива: %d\n", lt);
for(i = 0; i < lt; i++){
s = str;
}
printf("%s\n", &s);
return 0;
}

Я пробовал изменить условие завершения цикла и прибавление значения i, и отнятие значения lt но нифига не помогло. В чём причина?
Vadim Zhdanov
Vadim Zhdanov
9 826
Функция scanf либо scanf_s считывает символы со стандартного потока до первого пробела либо символа конца строки в кодировке cp866. Поэтому, чтобы ввести строку с пробелами она не подходит. А для строки строго определённого размера нужен указатель типа char, размер строки + символ конца строки.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <conio.h>
void message(short);
#define N 256
int main() {
char str[N];
int n, size;
char * line;
message(1);
gets_s(str);
size = strlen(str);
message(2);
printf("%d\n", size);
size++;
line = (char *)calloc(size, sizeof(char));
for (n = 0; n < size - 1; n++) {
line[n] = str[n];
} line[n] = '\0';
message(3);
printf("%s", line);
free(line);
_getch();
return 0;
}
void message(short command) {
setlocale(LC_CTYPE, "Russian_Russia.1251");
switch (command) {
case 1: printf("\n Введите строку: "); break;
case 2: printf("\n Строка получена, размер массива: "); break;
case 3: printf("\n Новая строка: "); break;
}
setlocale(LC_CTYPE, "English_United States.866");
}
Vadim Zhdanov Во спасибо, буду изучать сей манускрипт.
При таком printf могут выводиться и числа прошлогоднего календаря.
П*
Павел * * * * *
80 053
Vadim Zhdanov не понял, аргументируй
Vadim Zhdanov По смотри на ответы. Как бесполезен и немощен ты оказался со своим замечанием.
Хотя в конце концов понимание ко мне вроде пришло. И на том спасибо.
Потому что у тебя есть 2 переменные str - это массив из 255 чаров и s это просто чар.
когда ты пишешь
for(i = 0; i < lt; i++){
s = str;
}
то на самом деле ты lt раз присваиваешь переменной s значение которое равно ( (адрес str % 255 ) - 128)
в твоем случае значение этого выражения будет равняться коду символа 'd'

НО ЭТО ВСЕ МЕЛОЧИ !!!

после этого ты делаешь такое : printf("%s\n", &s);
то есть пытаешься всунуть адрес символа вместо строки.
в результате получаешь мусор. счастье что ты вообще хоть что то получил на экране.
Tilek Abikov
Tilek Abikov
1 387
Vadim Zhdanov А теперь если не рудно, исправленный пример пожалста
Vadim Zhdanov ( (адрес str % 255 ) - 128) я не понял что это значит.
Vadim Zhdanov Я так понимаю что тут переменной s присваивается значение элемента с индексом i из массива str, а затем на вывод идёт значение находящееся по адресу переменной s. что тут не так?
Vadim Zhdanov Для того чтобы переменной s присваивалось значение элемента с индексом i из массива str надо написать так s = str;
а у тебя s = str;
А где разница?
межет так?
for(i = 0; i < lt; i++){
s = str [ i ];
printf("%s\n", &s);
}
Бла
Бла
810