我正在开发一个小项目,我无法访问任何C标准库.(从头开始构建一个ARM结构的微内核.甚至必须实现printf)
在这种情况下,我使用Duff的机器方法实现了strcmp.
以下是整个代码.
int
strcmp ( const char *str1, const char *str2 )
{
while ( *str1 || *str2 )
if ( *(str1++) != *(str2++) ) return *str1 - *str2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是有道理的; 有些时候它似乎适用于测试用例,直到最终系统发生故障.我追查到了这个strcmp.
起初我以为它首先递增str1然后比较str2 BEFORE str2递增.事实证明不是,但有人可以确认在某些情况下会发生这种情况吗?
然后我发现问题出现在*str1 - *str2中,所以将其更改为返回1.即,结果代码如下:
while ( *str1 || *str2 )
if ( *(str1++) != *(str2++) ) return 1;
return 0;
Run Code Online (Sandbox Code Playgroud)
虽然我想要的只是一个'等于'检查,所以改成'1'没有问题,但我仍然想知道为什么原始代码失败了.2.有人可以提出关于它如何失败的建议吗?我宁愿希望strcmp遵循标准的C接口,它返回一个非零值,告诉更多关于str1和str2的信息.
测试用例是:
code_t // a function pointer type
program_find ( char *program )
{
if (strcmp( program, "exit" ) == …Run Code Online (Sandbox Code Playgroud) 我在使用 std::cout、std::stringstream 和 std::string.c_str() 时遇到了一些问题。主要是,似乎有些东西被困在某个地方的缓冲区中,我不知道如何解决这个问题。
如果您不喜欢在 StackOverflow 中阅读代码,这里是我 github 的相关链接:TLString 类、测试类和单元测试——您可以跳到我陈述更简洁问题的最后。
在我的单元测试中,我有以下代码:
Test <std::string> strtest; // A unit test object expecting strings.
Test <const char*> chtest; // A unit test object expecting const char*s
// ...
TurnLeft::Utils::TLString str3("Exterminate.");
// ...
/* Basically, name() and expect() will use the passed arg.
* in the output in order to
* display output such as the following:
* str(): expecting 'Exterminate.' | Actual 'Exterminate.' => PASS
*/ …Run Code Online (Sandbox Code Playgroud) 我已经定义了一个char数组:
char d[6];
Run Code Online (Sandbox Code Playgroud)
如果我对以下内容有误,请纠正我:
此时没有为变量分配内存d.现在我要初始化它:
d="aaaaa";
Run Code Online (Sandbox Code Playgroud)
在这种初始化之后,就没有必要释放内存; 它将自动完成.
我如何知道是否char[]已初始化?我正在寻找像这样的模式
if (filled(d)){..}
Run Code Online (Sandbox Code Playgroud)
另外,如何用一种角色填充char []?
如果我有一个如下所示的结构:
typedef struct MyStruct {
char **str;
int num;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)
有没有办法让我初始化这个结构的数组.也许如下:
const MyStruct MY_STRUCTS[] = {
{
{"Hello"},
1
},
{
{"my other string"},
3
},
};
Run Code Online (Sandbox Code Playgroud)
最后,我希望在C++类中有一个经常声明的结构数组.如何才能做到这一点?是否可以拥有一个预先初始化的私人声明的成员?
我想很久以前我尝试了以下代码,一切顺利.但现在,我有一个分段错误,我无法找出哪个部分提供它.
#include <stdio.h>
#include <stdlib.h>
int main() {
char *test = NULL; // Empty string
char *a = "programming test";
int i = 0;
/* While the string "a" does not encounter a space,
I put its characters in the empty string "test" one by one. */
while(a[i] != ' ') {
test[i] = a[i];
i++;
}
printf("%s\n", test);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个小代码对我来说似乎是对的,我无法确定是什么问题.
我是C新手,我想执行此任务:声明并初始化一个字符串,然后将每个字符串元素重新分配给一个新值.
以这种方式编写代码:
char *str = "geeksforgeeks\0";
for (int i = 0; str[i] != '\0'; ++i) {
str[i] = 'a';
}
Run Code Online (Sandbox Code Playgroud)
抛出分段错误.
但是如果我以这种方式编写代码:
char string[] = "geeksforgeeks\0";
char *str = string;
for (int i = 0; str[i] != '\0'; ++i) {
str[i] = 'a';
}
Run Code Online (Sandbox Code Playgroud)
程序行为正确.
还有这段代码:
char str[] = "geeksforgeeks\0";
for (int i = 0; str[i] != '\0'; ++i) {
str[i] = 'a';
}
Run Code Online (Sandbox Code Playgroud)
行为正确.
两者有什么区别?不应该相同吗?
我有以下c ++代码:
#include "stdafx.h"
#include <atlstr.h>
int _tmain(int argc, _TCHAR* argv[])
{
CString OFST_PATH;
TCHAR DIR_PATH[MAX_PATH];
GetCurrentDirectory(MAX_PATH, DIR_PATH);
OFST_PATH.Format(DIR_PATH);
CHAR *pOFST_PATH = (LPSTR)(LPCTSTR)OFST_PATH;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想了解为什么pOFST_PATH程序结尾的值是"c"?什么也(LPSTR)(LPCTSTR)变的铸造OFST_PATH没有到写在那里的整个路径?
正如您在以下窗口中看到的那样,当对变量值进行调试时:
(警告)是的,这是我正在处理的任务的一部分,但此时我完全绝望,不,我不是在寻找你们来为我解决它,但任何提示都将不胜感激!(/警告)
我几乎正在尝试制作一个交互式菜单,用户打算输入一个表达式(例如“5 3 +”)并且程序应该检测到它是后缀表示法,不幸的是我遇到了分段错误错误,我怀疑它们与strlen函数的使用有关。
编辑:我能够让它工作,首先这
char expression[25] = {NULL};条线
变成char expression[25] = {'\0'};在调用
determine_notation函数时,我[25]从数组中删除了我传递的数组,如下所示:determine_notation(expression, expr_length);还有
input[length]我改成的部分,input[length-2]就像之前评论中提到的那样,input[length] == '\0'和input[length--] == '\n'.总之感谢大家的帮助!
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int determine_notation(char input[25], int length);
int main(void)
{
char expression[25] = {NULL}; // Initializing character array to NULL
int notation;
int expr_length;
printf("Please enter your expression to detect and convert it's notation: ");
fgets( expression, 25, …Run Code Online (Sandbox Code Playgroud) 如果我输入大于10的字符串,那么为什么不生成编译时错误,因为我声明str了大小为10?例如,我有输入welcome to the world,然后它正在编译和运行没有错误.
#include <stdio.h>
#include <conio.h>
int main() {
int i = 0, length;
char str[10];
printf("enter string: ");
gets(str);
while (str[i] !='\0') {
i = i + 1;
}
length = i;
printf("the length of string is %d", length);
}
Run Code Online (Sandbox Code Playgroud) 所以我想在 c++ 中做最简单的事情,反转一个字符串(存储新字符串)然后打印它
我的代码是:
char a[size] , reverse[size];
strcpy(a,"dlow olleh " );
for (int i = 0 ; i <= strlen(a); i++) {
reverse[i]= a[strlen(a)-i];
}
cout << reverse ;
Run Code Online (Sandbox Code Playgroud)
我必须注意,当 cout << reverse[i] ; 在 for 循环中,一切都很好,但是当我想将它打印为字符串时,它只是不这样做,我无法理解我错过了什么 cout << reverse[i] ;