#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 но нифига не помогло. В чём причина?
Другие языки программирования и технологии
Массив Си. Почему если я ввожу asd то в консоль выводятся dasd?
Функция 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");
}
#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 могут выводиться и числа прошлогоднего календаря.
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);
то есть пытаешься всунуть адрес символа вместо строки.
в результате получаешь мусор. счастье что ты вообще хоть что то получил на экране.
когда ты пишешь
for(i = 0; i < lt; i++){
s = str;
}
то на самом деле ты lt раз присваиваешь переменной s значение которое равно ( (адрес str % 255 ) - 128)
в твоем случае значение этого выражения будет равняться коду символа 'd'
НО ЭТО ВСЕ МЕЛОЧИ !!!
после этого ты делаешь такое : printf("%s\n", &s);
то есть пытаешься всунуть адрес символа вместо строки.
в результате получаешь мусор. счастье что ты вообще хоть что то получил на экране.
Vadim Zhdanov
А теперь если не рудно, исправленный пример пожалста
Vadim Zhdanov
( (адрес str % 255 ) - 128) я не понял что это значит.
Vadim Zhdanov
Я так понимаю что тут переменной s присваивается значение элемента с индексом i из массива str, а затем на вывод идёт значение находящееся по адресу переменной s. что тут не так?
Vadim Zhdanov
Для того чтобы переменной s присваивалось значение элемента с индексом i из массива str надо написать так s = str;
а у тебя s = str;
А где разница?
а у тебя s = str;
А где разница?
межет так?
for(i = 0; i < lt; i++){
s = str [ i ];
printf("%s\n", &s);
}
for(i = 0; i < lt; i++){
s = str [ i ];
printf("%s\n", &s);
}
Похожие вопросы
- Помогите пожалуйста решить задачи по информатике, одномерные массивы. Си шарп. Очень срочно. Пожалуйста!!!!
- Как сделать такую перестановку в массиве Си?
- Динамические массивы. СИ
- Массив Си
- Как правильно присвоить строку двойному массиву СИ. Спасибо! Вопрос внутри
- Объясните, что означает "доступ к любому элементу массива"? (СИ++) Если можно - на примере)
- нахождение седловой точки в массиве си шарп
- Функция в языке Си, которая если мы вводим числа до 100, пишет верно, если больше то неверно.
- Вопрос по языку Си. Почему в тесте написано, что эта программа будет работать?
- Необходимо упорядочить строки двумерного массива, по возрастанию первого эл-та. СИ.