2015-01-27 1 views
-2

Я изучаю C. Я написал следующую программу, чтобы попытаться изменить строку ввода пользователем. Однако это не работает. Хотелось бы знать, почему.Почему эта программа не отменяет строку?

Вот код с комментариями:

#include <stdio.h> 
#include <string.h> 

int main(int argc, char** argv) { 
    char* normal; // initialize the original string 
    printf("Give me a word.\n"); // ask for user input 
    scanf("%s", &*normal); // retrieve input, set variable 
    int n = strlen(normal); // retrieve length of string 
    char reversed[10] = {0}; // declare reversed string 

    // for loop starting from n length, decrementing by one 
    for(int i = n; i >= 0; i--) { 
    /* for i in the original string, the reversed string 
     equals n minus i, to reverse the string one by one */ 
     normal[i] = reverse[n - i]; 
    } 

    // print the newly reversed string 
    printf("%s\n", reversed); 

    return 0; 
} 
+0

@yellowantphil Просто заметил, что и удалил мои комментарии – ha9u63ar

+0

Если это не будет 'я = п-1 'в цикл? – ha9u63ar

+0

Адам: Вы устанавливаете элементы в 'normal' для данных в' reverse', но вы никогда не устанавливаете 'reverse'. Я предполагаю, что «обратный» и «обратный» - это одно и то же, с опечаткой, но оно заполнено нулями. – yellowantphil

ответ

1

Ваша идея почти правильно, за исключением, потому что

  1. Вы копируете '\0' в начале этого reversed строки.
  2. Вы scanf() ать в неверный указатель
  3. Вы делаете задание в обратном порядке, то есть вместо

    normal[i] = reversed[n - i]; 
    

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

    reversed[n - i - 1] = normal[i]; 
    /*    ^you should start at the n - 1 position, and '\0' 
    *     should be at position n. 
    */ 
    

Попробуйте вместо

#include <stdio.h> 
#include <string.h> 

int main() { 
    char normal[100]; // initialize the original string 
    char reversed[100]; // declare reversed string 

    printf("Give me a word.\n"); // ask for user input   
    if (scanf("%99s", normal) != 1) // retrieve input, set variable 
     return -1; 
    int n = strlen(normal); // retrieve length of string 

    for (int i = 0 ; i < n ; i++) { 
     /* for i in the original string, the reversed string 
     * equals n minus i, to reverse the string one by one 
     */ 
     reversed[n - i - 1] = normal[i]; 
    } 
    reversed[n] = '\0'; 

    // print the newly reversed string 
    printf("%s\n", reversed); 

    return 0; 
} 
1

Вы разыменования диком указатель:

char* normal; // uninitialized, points to random location 

scanf("%s", &*normal); // write to random location (at best) 

&* не имеет никакого эффекта, кстати. Все остальное, что происходит отсюда, в результате не определено.

Чтобы исправить это, вы могли бы написать:

char normal[10]; 
scanf("%9s", normal); 

Тогда ваш цикл продолжается и копии с reverse (который является пустым) в normal. Вероятно, вы скопировали с normal в reverse. Оператор присваивания - destination = source.

Наконец, ваш цикл (если вы сделали это исправление) начинается с normal[strlen(normal)], который является нулевым терминатором. Вам нужно проверить n > 0, а затем начать с i = n-1.

0

Это должно работать для вас:

#include <stdio.h> 
#include <string.h> 

#define SIZE 30 

int main() { 

    char normal[SIZE+1], reversed[SIZE+1]; 
    int n = 0, i = 0; 

    printf("Give me a word.\n"); 
    fgets(normal, SIZE, stdin); 
    //^ Reads in the text 
    n = strlen(normal); 


    for(i = n-1; i >= 0; i--) 
     reversed[n-i-1] = normal[i]; 
    //^ Changed, also note that the index starts with 0 

    reversed[n] = '\0'; 
    //^ End string 

    printf("%s\n", reversed); 

    return 0; 
} 
Смежные вопросы