标签: c-strings

K&R 中的 getline 函数定义

以下是第 29 页 K&R 中的 getline 实现,

# define MAXLINE 1000
int getLine(char s[], int lim)
{
    int c ,i ;
    for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c!= '\n'; ++i)
        s[i] = c;
    if(c == '\n'){
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
    
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我们需要在 for 循环中执行“i < lim - 1”。对于正确的索引,为什么“ i < lim ”不够?

任何帮助将非常感激...

c for-loop c-strings getchar

2
推荐指数
1
解决办法
99
查看次数

scanf() 不写入二维字符数组

我正在阅读一本教科书,使用 Code::Blocks v20.03 IDE 自学 C 编程。

我真的被一个小程序迷惑了,该程序将三个小字符串读入一个二维字符数组,然后将它们打印到屏幕上。该程序的代码如下所示。

#include <stdio.h>

int main(void)
{
   char *colors[3][10] = {'\0'};

   printf("\nEnter 3 colors seperated by spaces: ");
   scanf("%s %s %s", colors[0][0], colors[1][0], colors[2][0]);

   printf("\nYour entered: ");
   printf("%s %s %s\n", colors[0][0], colors[1][0], colors[2][0]);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译时错误或警告为零,执行时会产生以下输出。

您输入:(空)(空)(空)

使用 IDE 的 Watches 窗口显示没有任何内容写入数组。我知道数组名称被视为指向数组中第一个元素的指针。我还了解使用下标/索引来访问数组维度内的元素(例如整数数组),因此需要将这个 char 数组中的数组第二维保持为零。

可悲的是,这让我完全困惑,所以我需要帮助来填补我的理解空白。

此致,

斯图尔特

c runtime-error scanf c-strings multidimensional-array

2
推荐指数
1
解决办法
112
查看次数

验证固定长度字符串数组在编译时是否已排序

当尝试验证固定长度字符串数组在编译时是否已排序时,使用 时会出现奇怪的行为strncmp

如果验证函数引用全局数组,则 N 的所有值似乎都有效。

#include <cstring>

#define N 8 // vary values of N

const char STRINGS[][N] = {"a", "b", "c"};

constexpr bool is_sorted_global() {
    for (int i = 0; i < sizeof(STRINGS) / N - 1; i++) {
        if (strncmp(STRINGS[i], STRINGS[i + 1], N) > 0) {
            return false;
        }
    }

    return true;
}

int main()
{
    // always works for any N
    static_assert(is_sorted_global(), "list is not sorted");
}
Run Code Online (Sandbox Code Playgroud)

但是,如果使用函数模板,则只有 N 小于或等于 8 的值才有效。

template<const char …
Run Code Online (Sandbox Code Playgroud)

c++ sorting c-strings static-assert constexpr

2
推荐指数
1
解决办法
117
查看次数

在 C 中从 Char 到 Int 的转换总是给出正值

我正在编写可用于生产的 C 语言,我需要快速找到字符数组中字符的频率。我试图删除断言调用以在强制转换期间检查正值。我的断言是多余的代码还是有必要?

    char input[] = "Hello World";
    int inputLength = sizeof(input)/ sizeof(char);
    int *frequencies = calloc(256, sizeof(int));
    for(int i = 0; i < inputLength-1; i++)
    {
        int value = (int) input[i];
        assert(value > -1);//Is this line redundant?
        frequencies[value] += 1;
    }
    printf("(%d)", inputLength);
    PrintFrequencies(frequencies);
    free(frequencies);
Run Code Online (Sandbox Code Playgroud)

c integer casting c-strings char

2
推荐指数
1
解决办法
104
查看次数

C++:不会接受新的C字符串输入

首先,提前感谢您的帮助.这个问题让我疯了.

我有一个接受c字符串的程序,然后可以计算元音和辅音的数量.这没有问题.但是,我还需要包含一个允许用户创建新字符串的函数.但问题是,当用户从菜单中选择"新字符串"时,它只是遍历该newString()方法,而不等待用户的输入.然后它会创建一个新的空白屏幕.

这是整个计划.该newString()方法是在末端.

#include <iostream>    
using namespace std;

// function prototype
void printmenu(void);
int vowelCount(char *);
int consCount(char *);
int cons_and_vowelCount(char *);
void newString(char *, const int);

int main() {

    const int LENGTH = 101;
    char input_string[LENGTH];      //user defined string
    char choice;                        //user menu choice
    bool not_done = true;       //loop control flag

    // create the input_string object
    cout << "Enter a string of no more than " << LENGTH-1 << " characters:\n";
    cin.getline(input_string, LENGTH);

    do { …
Run Code Online (Sandbox Code Playgroud)

c++ c-strings

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

不为null终止C样式字符串

给一个字符串,比方说,

char *str = "Hello,StackOverflow!"
char newStr[30];
int l = strlen(str);
for(int i =0 ; i<l ; i ++ )
   newStr[i] = str[i];
printf("%s" , newStr);
Run Code Online (Sandbox Code Playgroud)

现在,我们知道c字符串的最后一个字符必须是'\0',因为在这里我们没有明确地做同样的事情(在字符串newStr的最后一个索引处存储'\ 0'),这个程序应该崩溃,因为printf不会找到字符串的结尾.

但是我注意到它有时很好用,有时它不是.可能是什么问题呢 ?它几乎每次都在工作.是不应该崩溃或给出一些运行时错误?

在C++中它也是同样的情况吗?

c string c-strings

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

使用指针修改动态字符数组

我正在尝试使用指针连接两个动态c数组(包含字符串).我在网上搜索了一堆使用strcat的东西,但我需要学习如何使用指针来做这件事.我还不清楚动态c阵列到底是什么,我只知道我必须使用"new".这是我目前无法编译的代码:

#include <iostream>
using namespace std;
#define MAX_CHAR 50


void append(char*, char*);

int main()
{
    char *str1 = new char[MAX_CHAR];
    char *add1 = new char[MAX_CHAR];
    str1 = "This string";
    add1 = " add this one";

    append(str1, add1);

    cout << str1;

    delete [] add1;
    delete [] str1;

    return 0;
}

void append(char *str, char *add)
{
   while(*str != '\0')
      str++;

   while(*add != '\0')
   {
      *str = *add;
      add++;
      str++;
   }
   *str = '\0';
}
Run Code Online (Sandbox Code Playgroud)

c++ pointers c-strings dynamic-arrays

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

如何在C中将输出从一个函数传递到另一个函数?

我的程序有两个独立的函数,它排除非素位,然后从中保留输出.除了我遇到的问题之外,目前我的工作方式并不正常,因为第一个函数排除非素数位置,然后第二个函数使用原始输入并保留而不是函数的输出一.我是C的新手,所以请放轻松我.

#include <stdio.h>
#include <string.h>

void reverse(char[], long, long);
int main()
{
    char str[50];
    int i, j, k, cnt = 0;
    long size;

    printf("Enter: ");
    scanf("%s", str);

    size = strlen(str);
    reverse(str, 0, size - 1);
    printf(str);
    return 0;
}

void reverse(char str[], long index, long size)
{
    char temp;
    temp = str[index];
    str[index] = str[size - index];
    str[size - index] = temp;
    if (index == size / 2)
    {
        return;
    }
    reverse(str, index + 1, size);
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是如此模糊,从一个输入输出的样本1234567将是 …

c function c-strings inverse

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

Haskell初学者我是如何获得IO(IO String)的

因此,我深入了解了一些Haskell(南非夜班),并且我制定了一个程序,可以通过计算任何给定期间的班次来减轻我的假期计划.

import System.Environment
import Data.List
import Data.List.Split
import Data.Time
import Data.Time.Calendar.WeekDate (toWeekDate)


-- merge xs and ys lists alternating value from each [ xs(0),ys(0),(xs(1),ys(1)..xs(n),ys(n) ]
merge :: [a] -> [a] -> [a]
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) = x : y : merge xs ys     

-- get part of list from index 'start' to 'stop'
slice :: Int -> Int -> [a] -> [a]
slice start_from stop_at xs = fst $ splitAt …
Run Code Online (Sandbox Code Playgroud)

io haskell types module c-strings

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

?错误“在此函数中未初始化使用了s1,s2”

这是我在编程基础课程的第一堂课后遇到的问题之一

gets()可以正常工作(我认为),但是“ cin”拒绝工作

int main(void)
{
    char *s1, *s2;
    puts("Enter your name and surname for gets()");
    gets(s1);
    puts("Enter your name and surname for cin()");
    cin >> s2;
    cout << s1 << "! Hello from gets" << endl;
    cout << s2 << "! Hello from cin" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望cin输出您在控制台中输入的内容,但是在输入programm之后等待一秒钟,然后所有内容将关闭,而没有任何输出。

屏幕截图是我们老师给我们的,它没有用

屏幕截图

c++ string c-strings fgets getline

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