2017-02-09 5 views
0

Вот простой код для изменения строки в C. Последний оператор printf печатает обратный порядок, но с вопросительным знаком в конце, в то время как я просто хочу напечатать обратную строку, а не вопрос mark Как это исправить?Знак вопроса в конце printf

#include<stdio.h> 
#include<string.h> 
int main(){ 
char new_string[100]; 
char string[100]; 
scanf("%s",string); 
printf("original_number = %s\n",string); 
int i; 
int l = strlen(string)-1; 

for(i = 0; i<=l; i++){ 
new_string[i] = string[l-i]; 
printf("%c\n",new_string[i]); 
    } 
printf("rev_number = %s\n",new_string); 
} 

вход: ABCD

выход: original_number = ABCD

д

с

б

rev_number = dcba?

+1

'символ new_string [100]; '->' символ new_string [100] = {0}; ' – BLUEPIXY

+0

Woah! , это сработало, не могли бы вы рассказать мне логику, char new_string [100] = {0}; –

+0

Поскольку 'new_string' не был инициализирован, отображается мусор. Нужно инициализировать с помощью 0 заранее или добавить нулевой ограничитель ('' \ 0'') после символьной строки. – BLUEPIXY

ответ

3

Нужно аннулировать строку. Добавьте эту строку после цикла for, где вы меняете строку.

new_string[i]='\0';

for(i = 0; i<=l; i++){ 
    new_string[i] = string[l-i]; 
    printf("%c\n",new_string[i]); 
} 
new_string[i]='\0'; // add this 
printf("rev_number = %s\n",new_string); 

check-here

0

Если возникает вопрос «Как добавить»? до конца строки? " Я должен ответов:

1) использовать strcat добавить еще один символ, например:

#include<stdio.h> 
#include<string.h> 
int main(){ 
    char new_string[101] = {0}; // +1 to be sure that enough place for '?' will be available 
           // {0} to init empty string 
    char string[100]; 
    scanf("%s", string); 
    printf("original_number = %s\n", string); 
    int i; 
    int l = strlen(string) - 1; 
    for (i = 0; i <= l; i++){ 
     new_string[i] = string[l - i]; 
     printf("%c\n", new_string[i]); 
    } 
    strcat(new_string, "?"); 
    printf("rev_number = %s\n", new_string); 
} 

2) положить ? и добавить символ \0 после конца цикла, например:

#include<stdio.h> 
#include<string.h> 
int main(){ 
    char new_string[101]; // +1 to be sure in place for '?' 
    char string[100]; 
    scanf("%s", string); 
    printf("original_number = %s\n", string); 
    int i; 
    int l = strlen(string) - 1; 
    for (i = 0; i <= l; i++){ 
     new_string[i] = string[l - i]; 
     printf("%c\n", new_string[i]); 
    } 
    // add one more char 
    new_string[i] = '?'; 
    // set the string end 
    new_string[i + 1] = '\0'; 
    printf("rev_number = %s\n", new_string); 
} 

Обратите внимание, что если вы заполните весь массив 0 как char new_string[101] = {0};, вам не нужно добавлять конец строки с new_string[i + 1] = '\0';, поэтому второй вариант может быть короче, если инициализация аналогична первой т один

Для обоих фрагментах у меня есть тот же выход

enter image description here

UPDATE: более

Один совет по работе со строками. Когда вход выполнен с scanf и вы знаете, сколько символов могут быть сохранены в массиве символов использовать следующий подход для предотвращения нарушения границ массива

char string[10]; // if you have 10 bytes 
scanf("%9s", string); // ask not more than 9 characters 

помните, что вам нужно еще один байты для «\ 0» (нулевой ограничитель).

-1

проблема вы принимаете «конец строки» в качестве последнего входа в течение loop.you не нужны переменный «л».вы можете сделать некоторые думают, как этот

int main() 
{ 
    char new_string[100]; 
    char string1[100]; 
    scanf("%s",string1); 
    printf("original_number = %s\n",string1); 
    int i; 


    for(i = 0; i<=strlen(string1); i++){ 
    new_string[i] = string1[i-1]; 

    printf("%c\n",new_string[i]); 
     } 
    printf("rev_number = %s\n",new_string); 
} 
0

прекратить new_string по new_string [я] = '\ 0' после того, как для цикла

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