Как заставить printf правильно распечатать строчку из пользовательского ввода argv в C - PullRequest
0 голосов
/ 06 февраля 2019

Я могу использовать это, чтобы напечатать мою строку по умолчанию, но когда я иду, чтобы напечатать пользовательский ввод, он не работает - вместо этого я получаю некоторые случайные символы и символы обратно

int i=0;
char* tok=strtok(defaultString," ");
while(tok!=NULL){
         i++;
         if (i==defaultInd){
             printf("%s \n", tok);
             break;             
         }
         tok=strtok(NULL, " ");
}    

Я считаю,что есть некоторая проблема с доступом к памяти или к чему-то, что хранится в памяти, которую я еще не инициализировал, но когда я пытаюсь использовать

char* tok=(char *)malloc(strlen(strtok(sent, " ")+1));

, это просто останавливает печать периодов.

Моя работа заключалась в том, чтобы напечатать argv с использованием цикла for, но я до сих пор не знаю, в чем собственно проблема.

Вот что мне нужно, чтобы напечатать пользовательский ввод

char* tok=strtok(argv," ");
    while(tok!=NULL){
         printf("%s\n", tok);
         tok=strtok(NULL," ");
    }

Я получаю последовательность символов (буквенно-цифровой, греческий и т. Д.) Вместо введенной строки

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019
char* tok = strtok(defaultString, " ");
    while (tok != NULL){
        myarg[count]=strdup(tok);
        count ++;
        printf("%s\n", tok);
        tok = strtok(NULL, " ");
    }
0 голосов
/ 06 февраля 2019

В

char* tok=(char *)malloc(strlen(strtok(sent, " ")+1));

вы просто выделяете часть памяти, размер которой зависит от результата strtok , но результат strtok равен не скопировано в возвращенный блок памяти


char* tok=strtok(argv," ");
while(tok!=NULL){
     printf("%s\n", tok);
     tok=strtok(NULL," ");
}

Если argv является вторым аргументом main , то это не char * но char **, поэтому ваш звонок неправильный

Что вы ожидали сделать?если вы хотите напечатать аргументы или программу, вы должны сделать что-то вроде:

while (*++argv != 0)
  puts(*argv);

Если вы хотите получить каждое слово из группы слов, указанных в первом аргументе программы:

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

int main(int argc, char ** argv)
{
  if (argc == 2) {
    char* tok=strtok(argv[1]," ");

    while(tok!=NULL){
      printf("%s\n", tok);
      tok=strtok(NULL," ");
    }
  }

  return 0;
}

Выполнение:

pi@raspberrypi:/tmp $ ./a.out "aze qsd wxc"
aze
qsd
wxc

Как вы видите, я должен использовать строку, когда я вызываю . / A.out , иначе есть 3 аргумента, и первый аргументпросто aze


В

int i=0;
char* tok=strtok(defaultString," ");
while(tok!=NULL){
         i++;
         if (i==defaultInd){
             printf("%s \n", tok);
             break;             
         }
         tok=strtok(NULL, " ");
}  

, если defaultString , например, "11 22 33" и defaultInd значения 2 вы напечатаете 22 * ​​1048 *

но вы не сказали, каковы значения этих переменных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...