2013-10-03 3 views
2

Я делал базовую программу струн и делал это. Существует строка следующим образом:Размер строки равен числу символов

#include<stdio.h> 
int main() 
{ 
    char str[7]="network"; 
    printf("%s",str); 
    return 0; 
} 

Он печатает network .В мой взгляд, он не должен печатать сеть. Некоторое значение мусора должно быть напечатано, потому что '\0' не заканчивает этот массив символов. Так как это напечатано? Не было никаких предупреждений и ошибок.

+0

Вам повезло, и '' \ 0'', предоставленный '' network '', не был перезаписан ничем иным, когда вы печатали' str'. – zoska

+0

Я бы не стал так быстро принимать answser. Ни один из ответов не отвечает на ваш вопрос. – idoby

+0

в C++ необходимо, чтобы строковый массив был больше, чем общее количество символов, но в c это не так. – mrigendra

ответ

3

Это потому, что

char str[7]="network"; 

такая же, как

char str[7]={'n','e','t','w','o','r','k'}; 

str является допустимым char массив, но не строка, потому что это не завершается нулем. Таким образом, это неопределенное поведение для использования %s для его печати.

Ссылка: C FAQ: Is char a[3] = "abc"; legal? What does it mean?

+0

, так как \ 0 не заканчивает символьный массив, строка сводится к массиву символов. – mrigendra

+0

@mrigendra Точка в том, что это не допустимая строка C, поэтому вы не можете использовать '% s' для печати в' printf'. Неопределенное поведение может привести к чему-либо. –

+0

поэтому, если char arr [7] = "hello my netowrk"; он будет печатать первые 7 символов, потому что теперь это массив символов. Но это показывает ошибку. – mrigendra

3
char str[7]="network"; 

Это Запускает Undefined behavior.

Вы не объявили массив с достаточным пространством

Это должно быть

char str[8]="network"; 
+0

Нет, определение 'str' не является неопределенным поведением, это не строка, а действительный массив' char'. –

+0

Да, печать его вызывает неопределенное поведение. – zoska

+0

Определение также неверно. потому что OP хочет поместить 8 символов в длину массива из 7 символов. из-за меньшей длины, чем требуется, игнорируя Null и делая эту недопустимую строку. и затем печатающая строка, которая не имеет нулевого завершения. Invokes UB. – Gangadhar

0
char str[7]="network"; 

вы не предоставили достаточно места для строки

char str[8]="network"; 
+0

Это точно то же, что и Гангадхар в его ответе. – zoska

+0

Я не читал, что –

0

Вполне возможно, что стек страницы начните с нуля полностью в вашей системе, так что строка фактически заканчивается нулями в памяти , но не благодаря вашему коду.

Попробуйте посмотреть программу в памяти с помощью отладчика, прочитав документацию на платформе или распечатав содержимое str[7], чтобы получить некоторые подсказки. Это вызывает неопределенное поведение, но это не имеет значения, когда вы пытаетесь выяснить, что делает ваш конкретный компилятор и ОС в данный момент времени.

+0

пробовал его на turbo c в windows 7 и на gcc в ubuntu. Я получил тот же ответ. какой отладчик я могу использовать для них – mrigendra

+0

, на самом деле strcpy и strcmp работают над этим. его поведение похоже на строку. – mrigendra

+0

Опять же, для ОС вполне разумно отображать нулевые страницы для пространства стека. Это означает, что любой байт, который вы не пишете, остается нулевым. Просто запустите Visual Studio или GDB и взгляните на пространство памяти сразу после вашей «строки». – idoby

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