- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经编写了 C 程序,它将使用 read() 用户输入进行读取,例如:
添加 1 2 3
结果:6
现在的问题是,一旦按下 enter,read 就会停止读取。如果我想使用除按 Enter 以外的任何其他字符终止怎么办?例如:
添加 1 2 3;
结果:6
注意--> 当我按下 ;阅读应该停止阅读并显示结果。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void) {
while(1) {
char buff[50];
int rcount = read(STDIN_FILENO, buff, 50); //Reading user input
//write(1, buff, rcount);
buff[rcount - 1] = '\0'; //Converting user input as a string(char array)
/*If nothing is given and user press enter*/
if(strcasecmp(buff, "") == 0) {
write(1, "Invalid argument\n", sizeof("Invalid argument\n"));
}
/*Getting the first argument*/
char *arr = strtok(buff, " ");
if(strcasecmp(arr, "exit") == 0) {
break; //Break out of loop when exit is typed in
}
if(strcasecmp(arr, "add") == 0) {
add(arr); //When first arg is add, call to add func
}
else if(strcasecmp(arr, "sub") == 0) {
subtract(arr); //When first arg is sub, call to sub func
}
else if(strcasecmp(arr, "mul") == 0) {
multiply(arr); //When first arg is mul, call to mul func
}
else if(strcasecmp(arr, "div") == 0) {
divide(arr); //When first arg is div, call to div func
}
/*When first argument is anything else*/
else {
write(1, "Invalid argument\n", sizeof("Invalid argument\n"));
}
printf("\n");
}
}
void add(char *arr) { //To add numbers --> args > 1
int sum = 0;
while(arr != NULL) { //Loop to get all the numbers and using them to perform task
//printf("%s\n", arr);
int a = atoi(arr); //Converting arg/number to int
sum += a;
arr = strtok(NULL, " \n;");
}
char w[50];
int count = sprintf(w, "Result: %d\n", sum); //to use 'write', need to store sum as result so using sprintf instead of printf. Guess we've got no other option?
write(1, w, count);
return;
}
void subtract(char *arr) { //To subtract numbers --> args > 1
arr = strtok(NULL, " \n"); //To move to second arg
int subt = (int) atoi(arr); //to get the first number/2nd arg, as we will subtract remaining nums from this
arr = strtok(NULL, " \n"); //To move to remaining numbers, args > 2
while (arr != NULL) {
//printf("%s\n", arr);
int a = atoi(arr);
subt = subt - a;
arr = strtok(NULL, " \n");
}
char w[50];
int count=sprintf(w, "Result: %d\n", subt);
write(1, w, count);
return;
}
void multiply(char *arr) { //To multiply numbers --> args > 1
int mult = 1;
arr = strtok(NULL, " \n");
while (arr != NULL) {
//printf("%s\n", arr);
int a = atoi(arr);
mult = mult * a;
arr = strtok(NULL, " \n");
}
char w[50];
int count=sprintf(w, "Result: %d\n", mult);
write(1, w, count);
return;
}
void divide(char *arr) { //To divide numbers --> args > 1
arr = strtok(NULL, " \n");
float div = (float) atoi(arr);
//printf("%f", div);
//printf("\n");
arr = strtok(NULL, " \n");
while (arr != NULL) {
//printf("%s\n", arr);
float a = (float) atoi(arr);
div = div / a;
arr = strtok(NULL, " \n");
}
char w[50];
int count=sprintf(w, "Result: %f\n", div);
write(1, w, count);
return;
}
最佳答案
这是一个可能有帮助的示例,您可以根据需要将任何终止字符传递给它:
int add(char *str, char term)
{
int res = 0;
while (*str)
{
while (*str && !isdigit(*str))
str++;
if (*str && isdigit(*str))
res += atoi(*str);
if (*str == term)
break ;
while (*str && isdigit(*str))
str++;
}
return res;
}
关于add/sub/div/mul 的 C 解析器程序。读取用户的输入想要在分号处终止我的程序而不是按回车,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56978186/
;用作语句分隔符,所以放置多个;在语句的末尾很好,因为它只是添加了空语句。 我遇到了这个有多个 ; 的代码最后但删除它们会导致错误: $line =~s;[.,]$;;; 应该与 $line =~s;
当使用自动完成来填充方法参数时,大多数情况下最后应该有一个分号。 似乎必须有一些键盘快捷键可以在最后输入分号(也可能是换行符),但我找不到它! 谢谢。 编辑 : 也许问题不清楚,当完成一个自动完成方法
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我知道我不应该在循环后放置分号。但我正在学习,不小心插入了一个。我想确切地知道我的错误到底发生了什么。所以下次发生类似的事情时,我就知道错误的根源。 在下面的代码中,在这部分代码中: triangul
我想拆分我的查询,但没有得到完全符合我要求的答案。 我的字符串如下: select 1;select \\2; select 3\\;copy customer from 's3://mybucket
VBA 中带有 Debug.Print 语句的分号 ( ; ) 的实际值/含义是什么? 我经常使用它,但对它没有真正的了解,我所知道的是它不等于 vbTab 常量,因为间距不一样。 IE。 Debug
我需要从 HTML 中的 javascript 代码获取分配的变量名称和值。 例如有html代码: ~~ contents var value1 = 55;var value2= 27;
我正在用 JSFiddle 校对这个函数,它说第二行缺少分号,但是我无法确定它会去哪里。 function debtSpiral() { var debtID = setInterval(debt
给定一个使用 ; 策略的有效 Coq 证明,是否有一个通用公式可以将其转换为用 . 替换 ; 的有效等效证明;? 许多 Coq 证明使用 ; 或战术排序策略。作为初学者,我想观察各个步骤的执行,因此我
我被困在工作中,电脑被锁定。但我正在尝试练习我的 Scala。我正在使用 Ideone.com,因为我什至无法安装 scalac... 无论如何这不是编译: class DPt(var name: S
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
考虑这些文件名。 ; f - Copy.txt ;f.txt f - Copy ;- Copy.txt f - Copy.txt 我有这段代码可以解析任何文件中的 & 符号,答案是:Drag and
为什么带有验证器(Mozilla 或 JSlint)的 Aptana 会提示这段代码: var collectionOfValues = { key0 : value0; key1 :
有什么方法可以绑定(bind); (\059) 到 tmux 中的命令? 默认情况下,它绑定(bind)到最后一个 Pane ;但是,我想将其重新绑定(bind)到 select-pane -R。 我
我有一个 Java 字符串,它实际上是一个 SQL 脚本。 CREATE OR REPLACE PROCEDURE Proc AS b NUMBER:=3; c
我有一个 python 字符串: names = "John, Paul; Sally/Frank" 我想用 , 分割字符串;/.我试过: names.split(",") 但我不确定如何通过所有分隔
在声明一组变量时使用逗号而不是分号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
在声明一组变量时使用逗号而不是分号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
我一直在尝试并查看各种命令,但似乎无法找到正确的语法; 我想合并两个 ls 命令的输出,除以 ;(分号)并将输出写入文件。 我的 ls 命令是: ls *.lst ls -d -1 $PWD/*.ls
在声明一组变量而不是分号时使用逗号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
我是一名优秀的程序员,十分优秀!