我正在开发一种用C语言编写的文件共享程序.有一个函数可以读取数据文件并将数据存储到字符串中,并将此字符串返回给main函数,main函数发送回客户端.代码如下所示
char* ListFiles(){
FILE *fp;
char file[30];
char *f;
if((fp=fopen("list","r"))==NULL)
{
...
}
while (!feof(fp))
{
fgets(file,50,fp);
}
fclose(fp);
f=file;
printf("%s",f); //get display!!!
return f;
}
int main(){
char *files;
...
...
files=ListFiles();
printf("%s",files); //nothing display!!
sent();
}
Run Code Online (Sandbox Code Playgroud)
但是,此方法不起作用.没有任何显示,当然也没有发送任何内容.但我确实在函数ListFiles()中得到了正确的显示.我不知道发生了什么.我也使用strcpy(),它仍然无法正常工作.
如果我有一个C字符串,它是一个指向空终止字符数组的指针,我该如何将它转换为常规D字符串?
我想知道这个的原因是因为我目前正在使用外部C库,在错误时返回C字符串.
在这一行:
auto a = "Hello World";
Run Code Online (Sandbox Code Playgroud)
什么是确切的类型a?我猜char[]或者const char* const我不确定.
所以我好奇地阅读了一些C代码; 假设我们有以下代码:
char text[10] = "";
Run Code Online (Sandbox Code Playgroud)
那么C编译器在哪里放置空字符?
我可以想到3种可能的情况
'\0''\0'问题是,根据两种情况,是否有必要'\0'在执行时添加尾随strncpy.如果是第2和第3种情况,那么这不是绝对必要的,而是一个好主意; 如果它是案例1,那么这是绝对必要的.
这是什么?
我想要这样做的原因是因为我想逐行读取文件,并且每行检查它是否与正则表达式匹配.我正在使用getline()函数,它将行放入一个char *类型变量.我试图用来regexec()检查正则表达式匹配,但是这个函数要求你提供匹配的字符串作为a const char *.
所以我的问题是,我可以创建const char *一个char *?或者是否有更好的方法来解决我在这里要解决的问题?
编辑:我被要求提供一个例子,我没有想到并为首先没有给出一个而道歉.在写这篇文章之前,我确实读过@chqrlie的答案.以下代码给出了分段错误.
#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdbool.h>
#include <regex.h>
int main() {
FILE * file = fopen("myfile", "r");
char * line = NULL;
size_t len = 0;
ssize_t read;
regex_t regex;
const char * regexStr = "a+b*";
if (regcomp(®ex, regexStr, 0)) {
fprintf(stderr, "Could not compile regex \"%s\"\n", regexStr);
exit(1);
}
while ((read = …Run Code Online (Sandbox Code Playgroud) 我正在写strcat函数
/*appends source string to destination string*/
#include <stdio.h>
int main()
{
char srcstr[100], deststr[100];
char *psrcstr, *pdeststr;
printf("\n Enter source string: ");
gets(srcstr);
printf("\n Enter destination string: ");
gets(deststr);
pdeststr = deststr;
psrcstr = srcstr;
while(*pdeststr++)
;
while(*pdeststr++ = *psrcstr++)
;
printf("%s", deststr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于srcstr = " world"和deststr = "hello"我得到的hello,我希望看到hello world,这是我所看到的,如果我第一次改变while这样
while(*pdeststr);
pdeststr++;
Run Code Online (Sandbox Code Playgroud)
为什么我不能在第一行中写所有内容while,就像在第二行一样while?
我试图理解指针在这里是如何工作的.该findTheChar功能搜索str该角色chr.如果chr找到,则返回指向str首次找到字符的指针,否则nullptr(未找到).我的问题是为什么函数打印"llo"而不是"l"?虽然我写的代码main返回"e"而不是"ello"?
#include <iostream>
using namespace std;
const char* findTheChar(const char* str, char chr)
{
while (*str != 0)
{
if (*str == chr)
return str;
str++;
}
return nullptr;
}
int main()
{
char x[6] = "hello";
char* ptr = x;
while (*ptr != 0)
{
if (*ptr == x[1])
cout << *ptr << endl; //returns e
ptr++; …Run Code Online (Sandbox Code Playgroud) 下面是根据"标准C库,strlen.c的实现,
size_t strlen(const char *s){
const char *sc;
for(sc = s; *sc != '\0'; ++sc)
return (sc-s); }
Run Code Online (Sandbox Code Playgroud)
我对合法性的理解sc = s是否正确?
sc=s是一个合法的赋值,因为两个变量都被声明为const,都保护s指向的对象.在这种情况下,改变sc或s都指向但是任何赋值(或引用?)*s或者sc是非法的是合法的.
我有以下代码。
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
int main()
{
int i;
char s[MAXLINE];
for (i = 0; i < 20; ++i) {
s[i] = i + 'A';
printf("%c", s[i]);
}
printf("\nstrlen = %d\n", strlen(s)); // strlen(s): 20
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我应该写吗
s[i] = '\0';
Run Code Online (Sandbox Code Playgroud)
在循环执行后显式标记字符串的结尾还是自动完成?没有s[i] = '\0';函数 strlen(s) 返回正确的值 20。
请看代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
char name[10] = {'L','e','s','s','o','n','s'}; // did not add `\0`
char c;
for (int i = 0; name[i] != '\0'; i++)
{
c = name[i];
printf("%c", c);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我最后没有给\0,但仍然有效。
我的问题:\0在上面的情况下是自动添加的吗?
编辑:在这些情况下会发生什么:
char name[7] = {'L','e','s','s','o','n','s'};char name[8] = {'L','e','s','s','o','n','s'};我很抱歉编辑问题。