0

ユーザーがスペースなしで文字列 (電話連絡先情報) を入力するプログラムを C で作成していますが、姓、名などの情報はコンマで区切られています。

私がやろうとしているのは、コンマの間の文字列フィールドが(strtok_r関数を使用して)トークンになり、文字列配列に割り当てられ、プログラムの最後に各トークンを出力する関数を書くことです。

以下のコードはこれまでの私の試みですが、期待どおりに出力されません。結果はランダムな ASCII 文字になります。これは、ポインターの扱いがいかに悪いかによるものだと思います。どんな助けでも大歓迎です。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void commaCut(char *input, char *command, char *last, char *first, char *nick, char *detail, char *phone);

int main()
{
char *str, *token, *command;
char *last, *first, *nick, *detail, *phone, *saveptr;

char input[100];
int commaCount = 0;
int j;
str = fgets(input,100,stdin);
commaCut(str, command, last, first, nick, detail, phone);
printf("%s %s %s %s %s %s\n",command,last,first,nick,detail,phone);
exit(0);
}

void commaCut(char *input, char *command, char *last, char *first, char *nick, char *detail, char *phone)
{
  char *token, *saveptr;
  int j;
  int commaCount = 0;
  for (j = 0; ; j++, commaCount++, input = NULL)
  {
    token = strtok_r(input, ",", &saveptr);
    if (token == NULL)
      break;
    if (commaCount == 0)
      command = token;
    if (commaCount == 1)
      last = token;
    if (commaCount == 2)
      first = token;
    if (commaCount == 3)
      nick = token;
    if (commaCount == 4)
      detail = token;
    if (commaCount == 5)
      phone = token;
 }
4

1 に答える 1

1

問題は、関数firstで変更されたポインタなどがのポインタのコピーであるため、のポインタは変更されずに初期化されず、任意のメモリ位置を指していることです。ポインタの値を変更するには、これらのポインタのアドレスを渡す必要があります。commaCutmainmainmain

関数をに変更します

void commaCut(char *input, char **command, char **last, char **first, char **nick, char **detail, char **phone)
{
  char *token, *saveptr;
  int j;
  int commaCount = 0;
  for (j = 0; ; j++, commaCount++, input = NULL)
  {
    token = strtok_r(input, ",", &saveptr);
    if (token == NULL)
      break;
    if (commaCount == 0)
      *command = token;
    if (commaCount == 1)
      *last = token;
    if (commaCount == 2)
      *first = token;
    if (commaCount == 3)
      *nick = token;
    if (commaCount == 4)
      *detail = token;
    if (commaCount == 5)
      *phone = token;
 }

そしてそれを呼びます

commaCut(str, &command, &last, &first, &nick, &detail, &phone);

main

于 2012-09-19T22:59:26.340 に答える