C 在“中”的句子中交换单词;";

C 在“中”的句子中交换单词;";,c,pointers,strtok,C,Pointers,Strtok,我有一个学校的作业,其中我必须做一个项目,从CMD中获取参数,每个参数中有两个单词,用/分隔,然后插入句子,程序应该找到第一个单词的所有出现处,并用第二个替换,我只是想用strtok\u r让它正常工作 这是我的密码: #包括 #包括 #包括 int main(int args,char*argv[]){ 字符*令牌; 字符*2; char veta[1000]; int i,j,k; INTERR; 字符*saveptr1,*saveptr2; 如果(fgets(veta,1000,标准){

我有一个学校的作业,其中我必须做一个项目,从CMD中获取参数,每个参数中有两个单词,用
/
分隔,然后插入句子,程序应该找到第一个单词的所有出现处,并用第二个替换,我只是想用strtok\u r让它正常工作

这是我的密码:

#包括
#包括
#包括
int main(int args,char*argv[]){
字符*令牌;
字符*2;
char veta[1000];
int i,j,k;
INTERR;
字符*saveptr1,*saveptr2;
如果(fgets(veta,1000,标准){
令牌=strtok_r(veta、\n、&saveptr1);
k=1;
while(令牌!=NULL){
printf(“周期%d:\n”,k++);
printf(“%s\n”,标记);
对于(i=1;i
当我在CMD中输入参数并插入带有四个单词的句子时,执行了4个循环,但输出不是我希望的那样。。。例如,当我给出以下参数:
hi/hello how/good no/yet
并插入句子时,输出为:

Cycle1: 
(first word of sentence)
hi hello
how good
no yet
Cycle4: 
(second word of sentence)
hi (null)
how (null)
no (null)
Cycle4: 
(third word of sentence)
hi (null)
how (null)
no (null)
Cycle4: 
(fourth word of sentence)
hi (null)
how (null)
no (null)
什么时候应该是这样:

Cycle1: 
(first word of sentence)
hi hello
how good
no yet
Cycle4: 
(second word of sentence)
hi hello
how good
no yet
Cycle4: 
(third word of sentence)
hi hello
how good
no yet
Cycle4: 
(fourth word of sentence)
hi hello
how good
no yet
我可能修不好,你能帮我吗


提前谢谢。

正如我所说的,修改它的第一个参数,你需要先保存argv中的单词

我还建议您不要修改argv,检查参数是否正确检查
strtok
strtok\u r


例如,您可以执行以下操作:

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

int main(int argc, char *argv[])
{
  char ** first = malloc((argc - 1) * sizeof(char *));
  char ** second = malloc((argc - 1) * sizeof(char *));
  int i;

  for (i = 1; i != argc; ++i) {
    char * s = strdup(argv[i]);

    if (((first[i - 1] = strtok(s, "/")) == NULL) ||
        ((second[i - 1] = strtok(NULL, "/")) == NULL)) {
      fprintf(stderr, "invalid argument '%s'\n", argv[i]);
      return -1;
    }
    /* debug */
    else
      printf("first[%d]='%s' second[%d]='%s'\n", i-1, first[i-1], i-1, second[i-1]);

  }

  /*
  here you read sentences and do the substitutions
  */

  /* free resources */
  for (i = 0; i != argc - 1; ++i) {
    free(first[i]);
  }
  free(first);
  free(second);

  return(0);
}
在valgrind下执行:


注意:这是可能的

  char * first[argc - 1];
  char * second[argc - 1];

相反,要在堆中分配第一个和第二个数组,但在编译时堆栈中有未知大小的数组,我建议您不要使用这种方式

正如我所说的,修改它的第一个参数,您需要首先保存argv中的单词

我还建议您不要修改argv,检查参数是否正确检查
strtok
strtok\u r


例如,您可以执行以下操作:

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

int main(int argc, char *argv[])
{
  char ** first = malloc((argc - 1) * sizeof(char *));
  char ** second = malloc((argc - 1) * sizeof(char *));
  int i;

  for (i = 1; i != argc; ++i) {
    char * s = strdup(argv[i]);

    if (((first[i - 1] = strtok(s, "/")) == NULL) ||
        ((second[i - 1] = strtok(NULL, "/")) == NULL)) {
      fprintf(stderr, "invalid argument '%s'\n", argv[i]);
      return -1;
    }
    /* debug */
    else
      printf("first[%d]='%s' second[%d]='%s'\n", i-1, first[i-1], i-1, second[i-1]);

  }

  /*
  here you read sentences and do the substitutions
  */

  /* free resources */
  for (i = 0; i != argc - 1; ++i) {
    free(first[i]);
  }
  free(first);
  free(second);

  return(0);
}
在valgrind下执行:


注意:这是可能的

  char * first[argc - 1];
  char * second[argc - 1];

而不是在堆中分配第一个和第二个数组,但在编译时堆栈中有未知大小的数组,我建议您不要使用这种方式

strtok_r()
更改其输入字符串,这样您就无法在循环中重用它(
“foo bar”
==>
“foo\0bar”
)。在循环复制<代码> Agv[i]代码中,并使用该副本。如果您的学校正在教您使用CONIO。h,考虑辍学。<代码> StrtokSr())/代码>更改它的输入字符串,这样您就不能在循环(<代码>)FO栏中使用“代码>”Fo\\Bar“”。在循环拷贝>代码> ARGV[i] < /代码>中使用副本。如果你的学校正在教你使用CONIO。H,考虑退出。