以下是第 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 ”不够?
任何帮助将非常感激...
我正在阅读一本教科书,使用 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 数组中的数组第二维保持为零。
可悲的是,这让我完全困惑,所以我需要帮助来填补我的理解空白。
此致,
斯图尔特
当尝试验证固定长度字符串数组在编译时是否已排序时,使用 时会出现奇怪的行为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 语言,我需要快速找到字符数组中字符的频率。我试图删除断言调用以在强制转换期间检查正值。我的断言是多余的代码还是有必要?
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字符串的程序,然后可以计算元音和辅音的数量.这没有问题.但是,我还需要包含一个允许用户创建新字符串的函数.但问题是,当用户从菜单中选择"新字符串"时,它只是遍历该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) 给一个字符串,比方说,
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数组(包含字符串).我在网上搜索了一堆使用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的新手,所以请放轻松我.
#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将是 …
因此,我深入了解了一些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) 这是我在编程基础课程的第一堂课后遇到的问题之一
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之后等待一秒钟,然后所有内容将关闭,而没有任何输出。
屏幕截图是我们老师给我们的,它没有用