- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
/*
* tokenizer.c
*/
// Header files
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
// constants for the white spaces
// and the unprintable values
#define BLANK 0x20
#define TAB 0x09
#define VTAB 0x0b
#define FORM_FEED 0x0c
#define NEW_LINE 0x0a
#define CARRIAGE_RETURN 0x0d
// define the boolean variables for ease of access
#define TRUE 1
#define FALSE 0
/*
* Tokenizer type. You need to fill in the type as part of your implementation.
*/
struct TokenizerT_
{
// to hold the actual string provided at the argument
char *actual_string;
// to mover the pointer with in the provided
// string
char *pointer;
};
typedef struct TokenizerT_ TokenizerT;
/*
* TKCreate creates a new TokenizerT object for a given token stream
* (given as a string).
*
* TKCreate should copy the arguments so that it is not dependent on
* them staying immutable after returning. (In the future, this may change
* to increase efficiency.)
*
* If the function succeeds, it returns a non-NULL TokenizerT.
* Else it returns NULL.
*
* You need to fill in this function as part of your implementation.
*/
TokenizerT *TKCreate(char *ts)
{
TokenizerT *token = (TokenizerT *)malloc(sizeof(TokenizerT));
// condition to check whether the provided string is
// empty or not. If it is empty return NULL
if (strlen(ts) == 0)
{
return NULL;
}
token->actual_string = (char *)malloc(sizeof(char) * (strlen(ts) + 1));
// copy the provided string into structure's actual string
strcpy(token->actual_string, ts);
// set the actual string value to the pointer
token->pointer = token->actual_string;
// return the token
return token;
}
/*
* TKDestroy destroys a TokenizerT object. It should free all dynamically
* allocated memory that is part of the object being destroyed.
*
* You need to fill in this function as part of your implementation.
*/
void TKDestroy(TokenizerT *tk)
{
// set the pointer to null
tk->pointer = NULL;
// free the memory of the pointer
free(tk->actual_string);
// free the structure pointer
free(tk);
}
/*
* isWhiteSpace used to determine if the parameter character
* is a specified whitespace constant or not. If it contains
* returns TRUE else returns FALSE
*/
int isWhiteSpace(char ch)
{
if (ch == BLANK || ch == NEW_LINE || ch == VTAB || ch == TAB || ch == CARRIAGE_RETURN || ch == FORM_FEED)
{
return TRUE;
}
else
{
return FALSE;
}
}
/*
* getWhiteSpace: Returns the type of error is the character is?
*/
getWhitespace function gives me the "error: not all control paths return value". I know this error has been asked previously but I did not get how to fix in my code here.
char *getWhiteSpace(char ch)
{
switch (ch)
{
case BLANK:
return "0x20";
case TAB:
return "TAB";
case VTAB:
return "0x0b";
case NEW_LINE:
return "0x0a";
case CARRIAGE_RETURN:
return "0x0d";
case FORM_FEED:
return "0x0c";
}
}
/*
* TKGetNextToken returns the next token from the token stream as a
* character string. Space for the returned token should be dynamically
* allocated. The caller is responsible for freeing the space once it is
* no longer needed.
*
* If the function succeeds, it returns a C string (delimited by '\0')
* containing the token. Else it returns 0.
*
* You need to fill in this function as part of your implementation.
*/
char *TKGetNextToken(TokenizerT *tk)
{
// Copy the pointer of the structure to the temporary variable
// so as to not to modify the original
char *temp_ptr = tk->pointer;
// define length variable
int length = 0;
// condition to check whether the given character contains
// constant whitespace
if (isWhiteSpace(*temp_ptr))
{
while (isWhiteSpace(*temp_ptr))
{
char *whiteChar = getWhiteSpace(*temp_ptr);
// print the respective error message
printf("Error : [%s]\n", whiteChar);
// increment the pointer
*temp_ptr++;
}
}
// store the original length of temp_ptr
length = strlen(temp_ptr);
// define a new pointer to allocate the token that
// is been tokenized
char *token = (char *)malloc(length + 1);
// copy the string from the pointer of the structure
// till the length
int i = 0;
// to know the length of the string to token at
while (!isWhiteSpace(temp_ptr[i]) && i != length)
{
i++;
}
// copy the string into the token
strncpy(token, temp_ptr, i);
// set the end of the string with string terminator character
token[i] = '\0';
int j = 0;
In the for loop I am getting error: signed/unsigned mismatch error. I have declared the type of the j as 'int' so what is really giving me the error and how to fix it.
// modify the pointer of the struture TokenizerT
for (j = 0; j < length - strlen(token); j++)
{
tk->pointer[j] = temp_ptr[i];
i++;
}
tk->pointer[j] = '\0';
// return the token
return token;
}
/*
* isDecimal: This accepts a string returns a boolean value if the given string is
* a decimal value.
*/
int isDecimalValue(char *s)
{
// copy the parameter string into local string pointer
char *temp_ptr = s;
// loop through the string until string terminator character is found
while (*temp_ptr != '\0')
{
// by using isdigit function find whether the given
// character is not a digit.
if (!isdigit(*temp_ptr++))
{
// then return false
return FALSE;
}
}
// then return true value
return TRUE;
}
/*
* isFloat: This accepts a string and return a boolean value
* This is used to check whether provided string is a floating pointing.
* This also checks for decimal pointer and/or for an e-notation.
*/
int isFloatValue(char *s)
{
// define a temporary string variable
char *temp_ep = NULL;
// convert the string to long
long i = strtol(s, &temp_ep, 0);
// condition to check whether the temporary value is
// not converted to long or int
if (!*temp_ep)
{
// if the condition is true return false
return FALSE;
}
// condition to check whether the temporary pointer
// contains 'e' or 'E' or '.'(period)
if (*temp_ep == 'e' || *temp_ep == 'E' || *temp_ep == '.')
{
// if the condition is true return true
return TRUE;
}
// other wise return false
return FALSE;
}
/*
* isOctal: That accepts a string and returns a boolean value
* This is used to check if the string is an octal number.
* Whereas the first digit is a zero and the proceeding digits are 0-7
*/
int isOctalValue(char *s)
{
// copy the string to local variable
char *temp_ptr = s;
// condition to check whether the first character is '0' or not
if (*temp_ptr != '0')
{
// if true return false
return FALSE;
}
// increment the pointer to check the rest of the characters
// contain the octal value(0-7)
*temp_ptr++;
// loop though until the character is not 8 and 9
// and is it also a digit
while (isdigit(*temp_ptr) && *temp_ptr != '8' && *temp_ptr != '9')
{
// increment the pointer
*temp_ptr++;
// Check whether it is a string terminator.
if (*temp_ptr == '\0')
{
// if string satisfies all the conditions
// then return true
return TRUE;
}
}
// return false, if the string in a not an octal
// number
return FALSE;
}
/*
* isHex: This accepts a string and returns a boolean value
* This checks if the string begins with '0x' or '0X' and contains
* digits 0-9 and alpha A-F characters only
*/
int isHexValue(char *s)
{
// copy the string to local variable
char *temp_ptr = s;
// condition to check whether the starting value contains
// '0x' or '0X'
if (*temp_ptr++ == '0' && (*temp_ptr == 'x' || *temp_ptr == 'X'))
{
// loop through the pointer until it reaches end of
// the string
while (*(++temp_ptr) != '\0')
{
// condition to check the character contains
// hexa decimal value
if (!isxdigit(*temp_ptr))
{
// if it is not a hexa decimal value return false
return FALSE;
}
}
// if the string is hexa decimal value, return true
return TRUE;
}
// if the string is not hexa decimal value, return false
return FALSE;
}
/*
* displayTypeOfToken: Accepts the string and prints the type of token
*
* Token types:
* decimal integer - token is a digit (0-9) followed by any number of digits.
* octal integer - token is a 0 followed by any number of octal digits (i.e. 0-7).
* hexadecimal integer - token is 0x (or 0X) followed by any number of hexadecimal digits (i.e. 0-9, a-f, A-F).
* floating point - token is follows the rules for floating-point constants in Java or C.
*/
void displayTypeOfToken(char *token)
{
// condition to check if token is floating point and
// display the value
if (isFloatValue(token))
{
printf("Float: %s\n", token);
}
// condition to check if token is octal value and
// display the value
else if (isOctalValue(token))
{
printf("Octal: %s\n", token);
}
// condition to check if token is hexa value and
// display the value
else if (isHexValue(token))
{
printf("Hex: %s\n", token);
}
// condition to check if token is a decimal value and
// display the value
else if (isDecimalValue(token))
{
printf("Decimal: %s\n", token);
}
// display if all the above conditon fails
else
{
printf("Invalid: '%s'\n", token);
}
//Free token memory
free(token);
}
/*
* main will have a string argument (in argv[1]).
* The string argument contains the tokens.
* Print out the tokens in the second string in left-to-right order.
* Each token should be printed on a separate line.
*/
int main(int argc, char **argv)
{
// declare a char pointer to hold the input string
char *input = NULL;
// declare a pointer to the structure TokenizerT
TokenizerT *tokenizer;
// declare a character pointer to hold the tokens called at
// each call of TKGetNextToken function
char *token;
// if the length of the argument at command line is greater than 1
// then read the input from command line
if (argc > 1)
{
input = (char *)malloc(strlen(argv[1]) + 1);
strcpy(input, argv[1]);
input[strlen(argv[1])] = '\0';
}
// call the function TKCreate by passing the
// input string
tokenizer = TKCreate(input);
//condition to check if there is any problem in setting the value
if (tokenizer == NULL)
{
return 1;
}
// Print the input value present
printf("Provided input is: \"%s\"\n\n", tokenizer->actual_string);
// loop through end of the string
while (*(token = TKGetNextToken(tokenizer)))
{
//token = TKGetNextToken(tokenizer);
displayTypeOfToken(token);
}
// free the memory allocated to the structure pointer
TKDestroy(tokenizer);
return 0;
}
最佳答案
您的函数 getWhitespace 返回一个 char*。如果 ch 不匹配任何大小写怎么办?您必须在开关中添加默认情况才能处理任何其他值。
函数strlen返回一个类型size_t,它是一个无符号类型。这就是警告的原因,您比较 int (有符号)和 size_t。
关于代码是将字符串分解为标记。调试我的 C 代码会引发异常。我不知道如何处理 C 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39796122/
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
我有一堆 php 脚本计划在 CentOS 机器上的 cron 中每隔几分钟运行一次。我希望每个脚本在启动时自我检查它的前一个实例是否仍在运行,如果是则停止。 最佳答案 我这样做是为了管理任务并确保它
是否有 bash 命令、程序或 libusb 函数(尽管我没有找到)来指示 USB 设备的 OUT 或 IN 端点是什么? 例如,libusb_interface_descriptor(来自 libu
我如何知道 NSTextField 何时成为第一响应者(即当用户单击它来激活它时,但在他们开始输入之前)。我尝试了 controlTextDidBeginEditing 但直到用户键入第一个字符后才会
我怎么知道我的代码何时完成循环?完成后我还得再运行一些代码,但只有当我在那里写的所有东西都完成后它才能运行。 obj.data.forEach(function(collection) {
我正在使用音频标签,我希望它能计算播放了多少次。 我的代码是这样的: ; ; ; 然后在一个javascript文件中 Var n=0; function doing(onplaying)
我正在尝试向 Package-Explorer 的项目上下文菜单添加一个子菜单。但是,我找不到该菜单的 menuid。 所以我的问题是如何在 eclipse 中找到 menuid? 非常感谢您的帮助。
我有一个名为“下一步”的按钮,它存在于几个 asp.net 页面中。实际上它是在用户控件中。单击“下一步”时,它会调用 JavaScript 中的函数 CheckServicesAndStates。我
我正在尝试在 Visual Studio 中使用 C++ 以纳秒为单位计算耗时。我做了一些测试,结果总是以 00 结尾。这是否意味着我的处理器(Ryzen 7-1800X)不支持 ~1 纳秒的分辨率,
我有一个自定义 ListView ,其中包含一些元素和一个复选框。当我点击一个按钮时。我想知道已检查的元素的位置。下面是我的代码 public class Results extends ListAc
如何在使用 J2ME 编写的应用程序中获取网络运营商名称? 我最近正在尝试在 Nokia s40 上开发一个应用程序,它应该具有对特定网络运营商的独占访问权限。有没有这样的API或库? 最佳答案 没有
我使用服务器客户端组件,当在此组件的 TransferFile 事件中接收文件时,我使用警报消息组件。所以我希望,如果用户单击警报消息,程序将继续执行 TransferFile 事件中的代码,以在单击
如果我创建一个类A具有一些属性,例如 a, b, c我创建对象 A x1; A x2; A x3; ... A xN 。有没有办法在同一个类中创建一个方法来检索我创建的所有对象?我想创建类似 stat
我正在制作一个应用程序,其中包含相同布局的 81 个按钮。它们都被称为我创建的名为“Tile”的对象。问题是这些图 block 存储在数组中,因此我需要知道以 int 格式单击了哪个按钮才能调用图 b
UIProgressView有这个setProgress:animated: API。 有没有办法确切知道动画何时停止? 我的意思是这样的? [myProgress setProgress:0.8f
我正在使用两个 jQuery 队列,我希望其中一个队列在另一个队列完成后出队。我怎么知道第一个是否完成?我应该使用第三个队列吗?! 这是我所拥有的: var $q = $({}); $q.que
jQuery 中有没有一种方法可以知道是否至少有一个复选框已被选中? 我有一个包含很多复选框的表单,每个复选框都不同。 我需要一种 jQuery 的方式来表达这样的内容,这就是逻辑: If at le
给定 2 个选择 100 50 100 在这两种情况下,我都想在 .example 中获取数字,使用相同的选择器或者以某种方式知道 .no-text 和 之间的区别。带文字 执行
我在我的应用程序中使用 System.ComponentModel.BindingList 作为 DataGridView.DataSource。该列表非常大,需要几秒钟才能绘制到 DataGridV
我想知道用户在 Android 中选择的默认键盘。我知道我可以使用 InputMethodManager 访问已启用的输入法列表,但我想知道用户当前使用的是哪一个。 到目前为止,我已经尝试获取当前的输
我是一名优秀的程序员,十分优秀!