繁体   English   中英

带空格的char数组输入

[英]char array input with space

如果我将硬代码值赋予char * w =“ ls -l”,我的程序就可以正常工作,但是我正尝试采用输入形式,用户无法正常工作帮助我的代码::使用输入错误发生,我不理解fgets使用的概念fgets为execv提供garbig值

#include<stdio.h>
#include<sys/wait.h>
#include<stdbool.h>

void func(char **arr, char *w)
{
    int i = 0, j = 0, k = 0;

    char temp[100];

    for (i = 0; i < 100; i++)
    {
        if (w[i] == '')
        {
            arr[k] = temp;
            arr[k+1] = NULL;
            break;
        }
        if (w[i] == ' ')
        {
            arr[k] = temp;
            k++;
            j = 0;
        }
        else
        {
            temp[j] = w[i];
            j++;
        }

    }
}
int main()
{
    char *n = "/bin/ls";
    char *arr[10] = {''};
    char p[100] = {''};
    char *w = "ls -l";
    int i = 0;
    //printf("bilal-hassan-qadri $ >>");
    //fgets(p, 100, stdin);
    arr[2] = NULL;
    bool found = false;
    for (i = 0; i < sizeof(w); i++)
    {
        if (w[i] == ' ')
        {
            found=true;
            func(arr,w);
            break;
        }
    }
    if (!found)
      arr[0] = w;
    int status;
    int id = fork();
    if (id == 0)
    {
        if (execv(n,arr) < 0)
        {
            printf("invalid commandn");
        }
        else
        {
            printf("ninvalid command");
        }
    }
    else
    {
        wait(&status);
    }
}
  • 在函数func ,您必须将字符串复制到arr元素中,而不是仅传递temp的地址,该地址在离开函数时将消失。 如果系统支持,可以使用strdup而不是copy_string
  • 您必须在复制前以temp字符串终止。
  • 空字符串常量''似乎无效。 你不应该使用它。
  • fgets存储换行符\\n如果存在)。 检查并删除它是否不需要。

固定代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/wait.h>
#include<stdbool.h>

char *copy_string(const char *str) {
    char *s = malloc(strlen(str) + 1);
    if (s) strcpy(s, str); else {perror("malloc"); exit(1);}
    return s;
}

void func(char **arr, char *w)
{
    int i = 0, j = 0, k = 0;

    char temp[100];

    for (i = 0; i < 100; i++)
    {
        if (w[i] == '\0' || w[i] == '\n')
        {
            temp[j] = '\0';
            arr[k] = copy_string(temp);
            arr[k+1] = NULL;
            break;
        }
        if (w[i] == ' ')
        {
            temp[j] = '\0';
            arr[k] = copy_string(temp);
            k++;
            j = 0;
        }
        else
        {
            temp[j] = w[i];
            j++;
        }

    }
}
int main(void)
{
    char *n = "/bin/ls";
    char *arr[10] = {NULL};
    char p[100] = {0};
    char *w = "ls -l";
    int i = 0;
    //printf("bilal-hassan-qadri $ >>");
    fgets(p, 100, stdin);
    w = p;
    arr[2] = NULL;
    bool found = false;
    for (i = 0; w[i] != '\0'; i++)
    {
        if (w[i] == ' ')
        {
            found=true;
            func(arr,w);
            break;
        }
    }
    if (!found)
      arr[0] = w;
    int status;
    int id = fork();
    if (id == 0)
    {
        if (execv(n,arr) < 0)
        {
            printf("invalid commandn");
        }
        else
        {
            printf("ninvalid command");
        }
    }
    else
    {
        wait(&status);
        for (i = 0; arr[i] != NULL; i++) free(arr[i]);
    }
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM