标签: c-strings

有趣的strcmp实现失败.(C)

我正在开发一个小项目,我无法访问任何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)

c pointers character c-strings strcmp

0
推荐指数
1
解决办法
2460
查看次数

C++ 中的 StringStream/c_str() 损坏

我在使用 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)

c++ string c-strings stringstream

0
推荐指数
1
解决办法
2146
查看次数

char [length]初始化并处理它

我已经定义了一个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 []?

c c-strings

0
推荐指数
1
解决办法
158
查看次数

用C++初始化结构数组

如果我有一个如下所示的结构:

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++类中有一个经常声明的结构数组.如何才能做到这一点?是否可以拥有一个预先初始化的私人声明的成员?

c++ struct initialization c-strings c++11

0
推荐指数
2
解决办法
2万
查看次数

不明白为什么是段错误

我想很久以前我尝试了以下代码,一切顺利.但现在,我有一个分段错误,我无法找出哪个部分提供它.

#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 arrays pointers c-strings segmentation-fault

0
推荐指数
1
解决办法
68
查看次数

C字符串赋值给出了分段错误

我是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 c-strings

0
推荐指数
2
解决办法
534
查看次数

LPSTR LPCTSTR解释

我有以下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没有到写在那里的整个路径?

正如您在以下窗口中看到的那样,当对变量值进行调试时:

在此输入图像描述

c++ c-strings

0
推荐指数
1
解决办法
3557
查看次数

为什么 strlen 会导致 C 中的分段错误?

(警告)是的,这是我正在处理的任务的一部分,但此时我完全绝望,不,我不是在寻找你们来为我解决它,但任何提示都将不胜感激!(/警告)

我几乎正在尝试制作一个交互式菜单,用户打算输入一个表达式(例如“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)

c c-strings segmentation-fault

0
推荐指数
1
解决办法
2117
查看次数

程序来查找字符串的长度

如果我输入大于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 c-strings

0
推荐指数
1
解决办法
50
查看次数

我做错了什么? 反向字符串 C++

所以我想在 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] ;

c++ string reverse for-loop c-strings

0
推荐指数
2
解决办法
150
查看次数