2016-11-30 4 views
-6

Случай 1: Когда я беру строку ввода, она успешно дает выход, написав этот кусок кода:Неожиданный выход Printf для строки в C

#include <stdio.h> 
int main() 
{ 
    char *str; 
    scanf("%s",&str); 
    printf("%s",&str); 
    return 0; 
} 

Случай 2: С другой стороны, он выдает ошибки Runtime для этого фрагмента:

#include <stdio.h> 
int main() 
{ 
    char *str; 
    scanf("%s",&str); 
    printf("%s",str); 
    return 0; 
} 

Я нашел эту вещь своеобразно, и вы хотите знать, почему это происходит ... Спасибо заранее.

+5

Читайте о ** строки **, ** указатели **, ** массивы ** и ** динамическое распределение памяти ** вместе с ** спецификацией формата **. Добавьте вишню на торт, прочитав о * неопределенном поведении *. – haccks

+1

Что-то здесь не хватает памяти, а это 'str'. –

+0

Помимо того факта, что вы не выделяли память для 'str', случай 2 является правильной реализацией. Добавьте 'str = malloc (50);' или подобное перед использованием. В случае 1 вам повезет, и вы просто взрываете какую-то память, которая не принадлежит вам. – eddiem

ответ

2

Ни один из этих двух случаев не является правильным.

Случай 1 работал только потому, что вам повезло, вероятно, давая короткую строки в качестве входных данных. Попробуйте что-то вроде "bfjabfabjkbfjkasjkvasjkvjksbkjafbskjbfakbsjfbjasbfjasbfkjabsjfkbaksbfjasbfkja", и вы, скорее всего, пострадали от сбоя.

У вас должен быть блок памяти, связанный с str, либо в стеке, объявляя массив для него, либо в куче памяти malloc.

И вы не должны использовать оператора &.

Так что бы так:

#include <stdio.h> 
int main() 
{ 
    char str[50]; // 50 is arbitrary 
    scanf("%s",str); 
    printf("%s",str); 
    return 0; 
} 

или как это:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char* str = malloc(50); // 50 is arbitrary 
    scanf("%s",str); 
    printf("%s",str); 
    free(str); 
    return 0; 
} 
+0

Спасибо большое @YuriLaguardia –

+0

@yano Упс. Абсолютно! – yLaguardia

+0

Извините @yano. Я новичок в StackOverflow, поэтому не очень привык к нему. Я благодарю вас за то, что поделился с ним правильным кодом :) –

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