2016-04-26 2 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 


int main(int argc, const char *argv[]) 

{ 

argc++; 

int number; 

printf("Enter word you would like encoded\n"); 

scanf ("%s %i", argv[0], atoi(&argv[1])); 

printf("%s", argv[1]); 


int len = strlen(argv[1]); 

for (int i = 0; i < len; i++) 
{ 
    char offsetWord; 

    offsetWord = atoi(argv[i])+len; 

    putchar(offsetWord); 
} 

putchar('\n'); 

return 0; 
} 

Я пытаюсь создать программу c caesar cipher, которая компилируется из командной строки linux. Требования:Программа Caeser Cipher 'c' - формат% i ожидает аргумент типа int *, но имеет тип int int

1) ./rotn

ABCDEF

nopqrs)

2) ./rotn собаки

Гур dhvpx oebja СБК whzcf bire гур ynml qbt.

3) Запись в файл через «rotn».

./rotn собака лиса

$ кот лиса

Гур dhvpx oebja СБК whzcf bire гур ynml qbt.

4) с использованием различных сдвигов ./rotn -8 собака

Bpm ycqks jzwev ФНБ rcuxa wdmz уд TIHG Lwo.

Это все, что я получил. Я погрязнуть компиляции ошибок, то одна у меня прямо сейчас «формат предупреждения% я ожидает аргумент типа Int *, но аргумент 3 имеет тип междунар.

Любые предложения?

Спасибо за помощь

+2

Ошибка возникает из-за того, Целочисленным указателем является тип 'int *'. Однако вы не 'scanf' значения' argv'. Вы просто читаете их, и они представляют собой имя команды и аргументы командной строки. Они уже предусмотрены для вас из командной строки. Если вы хотите читать значения позже от пользователя, используйте свои собственные переменные, а не те, которые прошли через 'main'. – lurker

+1

Какова была цель 'argC++;', которую вы даже не используете (или проверяете)? –

ответ

1

Как уже отмечалась в комментариях, вы смешались несколько вещей:.

  • argc и argv аргументы, передаваемые в программу, когда она называется Существует всегда по крайней мере один аргумент, argv[0], название программы. Вы должны использовать эту информацию для анализа вашей командной строки.

  • scanf сканирует форматированный ввод из stdin. Вам здесь не нужен форматированный ввод, вы можете прочитать целую строку с fgets, или вы можете прочитать один символ с fgetc. Вы сохраняете отсканированные данные в новых переменных; не используйте повторно argv.

Программа, которая интерпретирует командную строку может выглядеть следующим образом:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, const char *argv[]) 
{ 
    int shift = 13;     // default shift 
    const char *infile = NULL;  // default is stdin 
    const char *outfile = NULL;  // default is stdout 
    int i = 1; 

    if (i < argc && argv[i][0] == '-') { 
     shift = atoi(&argv[i][1]); 
     if (shift <= 0) { 
      fprintf(stderr, "Illegal shift.\n"); 
      exit(1); 
     } 
     i++; 
    } 

    if (i < argc) { 
     infile = argv[i]; 
     i++; 
    } 

    if (i < argc) { 
     outfile = argv[i]; 
     i++; 
    } 

    if (i < argc) { 
     fprintf(stderr, "Illegal extra argument.\n"); 
     exit(1); 
    } 

    printf("shift: %d\n", shift); 
    if (infile) printf("infile: %s\n", infile); 
    if (outfile) printf("outfile: %s\n", outfile); 

    // now use this inforation in your program 

    return 0; 
} 

Конечно, вы все равно должны реализовать сам кодер. Вот несколько советов:

  • stdin действительный дескриптор файла, так что вы можете использовать, что если пользователь не указал имя файла или дескриптор, возвращенный из fopen(infile, "r") иначе. Вы можете проверить, указал ли пользователь имя файла с if (infile) .... Не забудьте закрыть файл, если он не является stdin.

  • Та же логика может быть использована для выходного файла, за исключением того, что вы должны открыть файл в режиме записи "w" и что вы должны использовать fprintf или fputc.

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