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

вопрос по си

сколькоб не ввёл символов всегда y = 12, где ошибочка?

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

int main(int)
{
char *x,z;
cin >> z;
x = &z;
int y = strlen(x);
printf("%d",y);
system("pause");
return 0;
}
На счёт 12 это что-то из области фантастики! Хотя всё может быть, так как здесь уже всё написано неправильно
z - это переменная типа char и ввести туда можно только 1 символ
в x Вы записываете адрес этой переменной
а в y вы пытаетесь определить размер строки, которая получается в результате построения программы и где там завершение строки будет - совсем неизвестно. То есть 12 Вы получили совершенно случайно. Так же могло выпасть и другое число

#include <string>
#include <iostream>
using namespace std;
int main()
{
char x[128];
cin >> x;
int y = strlen(x);
cout << y << endl;
system("pause");
return 0;
}

или так
#include <iostream>
#include <string>
using namespace std;
int main()
{
int y;
cout << "input str: ";
string s;
getline(cin, s);
cout << "output str: " << s << endl;
y = s.size();
cout << "size str: " << y << endl;
cin.get();
}

можно вообще без y = s.size(); и y = strlen(x); заменить их на for(y=-1;s[++y];);

Кстати я понял почему у Вас получилось число 12. Вы в предыдущей программе использовали "Hello world!", поэтому компилятор, скорее всего, Вам оставил этот участок памяти. Вы, похоже, могли увидеть и остаток предыдущей фразы
NS
Nurjan Sakenov
76 473
Лучший ответ
UB у тебя. Неопределенное поведение. x - указатель на символ. z - символ. x указывает на z. strlen перебирает символы, начиная с того, на который показывает x, пока не найдет 0, и возвращает количество символов до нуля. Но что находится в памяти после z - неопределено, это зависит от компилятора, ОС, состояния памяти и т. д. Поэтому результат может быть произвольным, в твоем случае - 12.
z - это char
x - указатель на char
а strlen считает, пока 0 не встретит.
а в x = &z - нет терминирующего нуля, это не строка.

char x[256];
cin >> x;
strlen( x );

до 256 символов влезет.
int main(int)
{
char *x,z[1024];
cin >> z;

// вот если тебе надо будет строка с пробелами, то тогда так
// cin . getline (z, 1024);

x = z;
int y = strlen(x);
printf("%d",y);
system("pause");
return 0;
}
это простейший способ исправить ситуацию: если ты вводишь строку то должно быть место под все ее символы, а ты выделяешь место ровно под один символ и тогда опредение длины строки - нонсенс
Andrey Pivovarov
Andrey Pivovarov
17 777
Спрашиваешь по Си, а пишешь на С++..определись с языком все-таки.
char - переменная которая может принять один символ, а ты в нее пишешь целую строку из консоли: cin >> z; Используй массив из char элементов.
Saika Yussupov
Saika Yussupov
1 906