如果我在另一个C程序中执行exec()函数作为主函数它完美地工作,而如果我把它作为主菜单中调用的函数,它会给我一些警告,并且函数不会运行。
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* for fork */
#include <sys/types.h> /* for pid_t */
#include <sys/wait.h> /* for wait */
int exec (void) {
char array[100];
char character;
int i = 0;
char* point;
int j = 0;
printf ("Digita una stringa");
printf ("\n");
do {
character = getchar();
array[i] = character;
i++;
}
while (character != '\n');
array[i-1] = '\0';
i = 0;
char* string[100];
char *word = strtok(array, " .");
j = 0;
while (word != NULL) {
printf("%s\n", word);
string[j++] = word; // Increment j
word = strtok(NULL, " .");
}
string[j] = NULL; // Make sure the array is NULL term
printf ("\n");
pid_t pid;
pid = fork();
int status;
if (pid == -1) {
perror("");
}else if (pid == 0) {
execvp(string[0], string); /* execute the command */
fprintf(stderr, "Failed to exec");
exit(1);
}
else {
//.. wait until the child ends
waitpid(-1, &status, 0);
}
return;
}
int read_input (void) {
int choice;
printf("Seleziona una voce dal menu");
do {
printf("\n");
scanf ("%i", &choice);
if (choice > 8 || choice < 1)
printf ("Attenzione, inserisci un valore contemplato dal menu");
}
while ( choice > 8 || choice < 1);
return choice;
}
void main (int argc, char *argv[]) {
printf ("------------------------\n");
printf (" MENU \n");
printf ("------------------------\n");
printf (" \n");
printf ("1) Esecuzione in foreground di un processo\n");
printf ("2) Ctrl -C\n");
printf ("3) Exit\n");
printf ("4) Background\n");
printf ("5) Pipe\n");
printf ("6) Jobs\n");
printf ("7) fg\n");
printf ("8) kill\n");
int menu = read_input();
switch (menu) {
case '1' :
exec ();
break;
case '2' :
//ctrl();
break;
case '3' :
//exit_();
break;
case '4' :
//background();
break;
case '5' :
//pipe();
break;
case '6' :
//jobs();
break;
case '7' :
//fg();
break;
case '8' :
//kill();
break;
}
}
这是警告:
elaborato.c:31:16: warning: initialization makes pointer from integer without a cast [enabled by default] char *word = strtok(array, " .");
答案 0 :(得分:2)
关于与输入相关的问题,
do {
printf("\n");
scanf ("%i", &choice);
if (choice > 8 || choice < 1)
printf ("Attenzione, inserisci un valore contemplato dal menu");
}
while ( choice > 8 || choice < 1);
输入一个整数并按Enter键后,scanf()
将消耗该数字,并在stdin中保留换行符。下一次循环(假设输入&lt; 1或&gt; 8或其他东西),scanf获得该换行符并继续。
在getchar()
之后添加scanf()
。
答案 1 :(得分:1)
答案在警告中,你应该将他们从评论中移到问题中。
elaborato.c:31:16: warning: initialization makes pointer from integer without a cast [enabled by default] char *word = strtok(array, " .");
这意味着word
,即char
指针正在从整数初始化。因此,似乎strtok()
返回一个整数......听起来不对。
来自strtok()
手册页:
#include <string.h>
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
这似乎是正确的,它会返回一个char *
....但它也表示它已在<string.h>
中声明...您不包括在内。由于未定义,编译器将其假定为int strtok()
。
修复:添加#include <string.h>
行。
答案 2 :(得分:0)
您遇到的问题是scanf
被跳过。
有关详细信息,请参阅here
在scanf()
消费换行符之后调用printf
并继续,用户无需输入任何内容。
它从标准输入读取下一个字符,这可能是换行符,因此不会提示您输入任何内容。
答案 3 :(得分:0)
我太累了,无法对整个代码发表评论(这真的很糟糕),所以我只是写下有问题的问题,以及如何平凡调试它
要做的第一件事就是检查我们是否得到了数字并返回main,因此:
int menu = read_input();
printf("got [%d]\n", menu);
运行此:
[snip]
1
got [1]
所以我们确实达到了这一点。
现在,我们检查这是什么。
int menu = read_input();
printf("got [%d] '1'=[%d]\n", menu, '1');
让我们运行:
1
got [1] '1'=[49]
因此,菜单存储一个整数1,而&#39; 1&#39; 是ascii中1的字符代码,嗯,不是整数1。
总的来说,我不知道缩小它的问题是什么。